2015-05-27 30 views
1

我今天花了大量的類似的問題,並試圖找出我的代碼有什麼問題,人們用back ticks有很多問題,引號等,但似乎沒有幫助或改變我的事業。我的代碼不會產生任何錯誤,但是當我使用echo來打印出我的查詢結果時,似乎該ID沒有得到一個值。mySQL - 不能刪除表格行(不顯示錯誤)

在我delete.php:

<? 
ini_set('display_errors',"1"); 

$username="xxx"; 
$password="xxx"; 
$database="xxx"; 

$conn = new mysqli(localhost, $username, $password, $database); 

if ($conn->connect_error) { 
    die("Connection failed: " . $conn->connect_error); 
} 

$id = (int)$_GET['number']; 
mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id.""); 

$conn->close(); 

?> 

而在我的main.php刪除按鈕(PHP的其餘部分被正確地顯示我的數據表):

<td><a href='delete.php?number='".$row['id']."'>Delete</a></td> 

人幫助挑選出當我點擊我創建的刪除按鈕時我的行不會被刪除的東西,或者更清楚的東西可以幫助我調試? (我不想爲此使用複選框)。

編輯:

我也試過這個代碼(在定義函數作爲$sql,我得到一個 「成功」 的消息:

if ($conn->query($sql) === TRUE) { 
    echo "New record created successfully"; 
} else { 
    echo "Error: " . $sql . "<br>" . $conn->error; 
} 

編輯2:

我改變了建議,我應該使用POST的建議,以爲我可能抓到了一些我以前沒有注意到的東西,但仍然無法正常工作。

echo "<td><form method='post' action='delete.php'> 
     <input type='hidden' name='row_id' value=".$row['id']." /> 
     <input type='submit' name='delete_row' /> 
     </form>"; 

-

if(isset($_POST['delete_row'])) { 
    $stmt = $conn->prepare("DELETE FROM tourdates WHERE ID = ?"); 
    $stmt->bind_param('i', $_REQUEST['row_id']); 
    $stmt->execute(); 
} 

如果我這樣做上述方式,沒有任何反應。也試過這種方法,並得到一個語法錯誤:

if(isset($_POST['delete_row'])) { 
    $id = $_POST['row_id']; 
    $sql = "DELETE FROM tourdates WHERE id=".$id; 
    mysqli_query($conn,$sql); 
} 
+0

您正在控制的錯誤來自連接而不是查詢。查看文檔http://php.net/manual/en/mysqli-stmt.error.php –

+0

@EricMartinez請參閱編輯... –

+0

用簡單的字符串定義查詢,打印它以查看它包含的內容,然後通過它到了mysql_query。像這樣:'$ query =「DELETE ...」; echo $ query; $ conn->查詢($查詢);'。 –

回答

4

,我可以看到一個潛在的問題是,你是不是引用localhost那麼PHP將尋找一個名爲localhost常數:

$conn = new mysqli('localhost', $username, $password, $database); 
       ^  ^here 

你也沒有檢查錯誤,所以你不會看到任何錯誤。解決這個問題的最簡單方法是讓mysqli拋出異常。只需添加到您的腳本的頂部:

mysqli_report(MYSQLI_REPORT_STRICT); 

我也不知道,如果你可以混合使用面向過程和對象mysqli的那樣。你應該堅持使用OOP版本。

除此之外,您不應該使用鏈接(GET請求)來執行刪除操作。如果網絡爬蟲或瀏覽器擴展嘗試獲取鏈接會怎樣?相反,您應該使用POST請求(例如帶有按鈕的表單)。

編輯:沒有引起你不要讓你的ID,當你將它轉換爲int,你總是會得到0另一個問題:

<td><a href='delete.php?number='".$row['id']."'>Delete</a></td> 
          ^Oooops, closing the href attribute value here... 

您的ID被放置在值後/外價值href的報價。如果您查看頁面的來源,則可以輕鬆驗證這一點。

您需要:

<td><a href='delete.php?number=".$row['id']."'>Delete</a></td> 
+0

感謝您使用localhost引用的提示。但是,'mysql_report'也不會返回任何錯誤。我將嘗試切換回作爲我的刪除按鈕,儘管之前我無法通過這種方式工作。 –

+0

@Eichhörnchen沒有錯誤?如果你使用'mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);'?請注意,在任何mysqli調用之前,這需要位於腳本的頂部。 – jeroen

+0

不,它只是一個空白頁... –

0

在你的PHP文件在您這裏,則更換這些代碼兩個部分,一是在報價寫你的主機

$conn = new mysqli('localhost', $username, $password, $database); 

你寫id=".$id.""id=".$id更換

把它寫成:

mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id); 

編輯:

如果你想看到的錯誤在查詢然後使用下面的代碼:

mysqli_query($conn,"DELETE FROM tourdates WHERE id=".$id) or die(mysqli_error($conn)); 
+0

不幸的是,這並沒有幫助。仍然沒有刪除並且沒有返回錯誤 –

+0

查看您的查詢中的錯誤使用我編輯過的部分中的代碼 –

0

爲什麼不使用try和catch看看你的錯誤?

反正試試這個

$stmt = $conn->prepare("DELETE FROM tourdates WHERE ID = ?");<br> 
$stmt->bind_param('i', $_REQUEST['number']);<br> 
$stmt->execute(); 
+0

請參閱編輯2,這對我無效 –

-1

會這樣的問題呢?

$id = (int)$_GET['number']; 

可能這會更好......?

$id = intval($_GET['number']); 

無論如何,echo($ query)打印一個空的ID,這可能是因爲你的參數不是一個整數。

+0

'(int)$ _ GET ['number']'是有效的句法。參見[PHP文檔](http://php.net/manual/en/language.types.type-juggling.php#language.types.typecasting)。 – vard

+0

@vard你是對的,我很抱歉,謝謝你的回答。所以這可能是箴言?:$ id =(int)$ _ GET ['number']; mysqli_query($ conn,「DELETE FROM tourdates WHERE id =」。$ id。「」);看看sql查詢,不要在$ id周圍出現雙引號導致問題,這樣sql就會認爲它是一個字符串。我錯了嗎 ? –

+0

嗯,它確實沒有什麼意義,因爲'id'不是數據庫中的字符串字段,儘管MySQL非常寬鬆,因爲如果輸入數據不是字段類型性能成本。如果MySQL在嚴格模式下運行,唯一可能導致問題的情況是。 – vard