2017-02-17 37 views
-1

我有一個MySQL數據庫,但我的功能不工作。我想知道我的數據庫查詢得到了多少結果,但我什麼都沒有回來,甚至不是0.我也試過$values->num_rows;相同的結果。不要回來了一些......只是沒有Num_rows不起作用?

我的代碼:

$values = $database->query("SELECT * FROM `wp_all_import_xml` WHERE name = '$title' AND price = '$price' AND shop = '$shop' AND link = '$link'"); 

$count_values = mysqli_num_rows($values); 

echo "ERROR by detecting Product (More than 1 Row return by SQL!): " .$title. " Preis: " .$price. " Shop: " .$shop. " Link: " .$link. "\t num_rows: " .$count_values. "\n"; 

我怎樣才能得到我得到返回的行的金額是多少?

問候

+3

打開錯誤報告。 –

+2

通過「無返回」,你的意思是你的'echo'語句成功運行,但'$ count_values'變量是空的嗎?其他變量有哪些?什麼*特別*發生?你的代碼是開放給SQL注入的,所以我們甚至不知道你實際執行的SQL語句。 – David

+0

是的,我沒有得到顯示值... - 但SQL語句並不重要...即使我的SQL語句錯誤,我也應該返回0 ... – Jan

回答

1

mysqli_num_rows函數確實有效。

觀察到的行爲的最可能的解釋是發生錯誤並被忽略。

要進行調試,請確保啓用錯誤報告。

修改代碼以檢查查詢的返回值。通過執行條件測試來驗證它沒有返回FALSE。

if ($values = $mysqli->query(...)) { 
    // query returned a resultset 
} else { 
    // query returned FALSE 
} 

如果我們需要檢索的行數,那麼我們就可以在選擇列表中使用COUNT(*)。

if ($res = $mysqli->query("SELECT COUNT(*) AS cnt FROM ... ")) { 

如果查詢成功,那麼即使計數爲零,我們也會返回一行。我們可以很容易地處理結果就像我們處理來自其他查詢的結果,而不需要與num_rows渣土,並擔心查詢是否緩衝或無緩衝等


我們將假設$database是一個mysqli連接,而不是PDO連接,因爲代碼包含對mysqli_num_rows函數的調用。如果它是PDO連接,那麼「num_rows不起作用」。


問題中的代碼遵循易受SQL注入攻擊的代碼中常見的模式。 (在本節中,我們無法確定SQL文本中包含的變量值是否可能不安全,因此我們無法判斷它是否存在漏洞)。

如果這是一個準備好的語句,綁定佔位符,然後我們可以告訴。
使用預處理語句和綁定佔位符。這並不難。

+0

我已經得到了解決方案。我收到一個錯誤。我現在的問題是,如果找不到任何東西或者其他問題出現,我是否會收到錯誤信息? 因爲我查了值手動在phpMyAdmin我在那裏得到一個值回我的SELECT查詢 – Jan

+0

成功地執行並返回一個空結果查詢是不是一個錯誤,在MySQL,SQL,mysqli的方面,這是完全有效執行返回零行的查詢。結果集將是空的。這是有效的。如果你喜歡真正得到具有計數排,然後用'SELECT COUNT(*)'查詢。這通常比將大型結果集返回給客戶端更高效。 – spencer7593

+0

我現在檢查與'$數據庫 - > error'查詢,並得到了我的錯誤。使用了錯誤的行名! – Jan