2010-03-30 119 views
1

我一直在使用準備好的語句,而現在我從來沒有遇到任何問題。PHP準備好的語句返回-1

現在我想:

$sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?"; 

$iDB = new mysqliDB(); // Extends mysqli 

$stmt = $iDB->prepare($sql); 

$stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange); 

$stmt->execute(); 

$stmt->bind_result($photoID,$caption); 

echo("Affected={$stmt->affected_rows}"); 

這將打印-1。我有三重測試,bindParam中的所有4個值都已設置,並且在使用各自的值粘貼到myAdmin時,sql查詢正常工作。

任何想法可能會導致此?

編輯::我在網上找到答案,顯然我需要使用$ stmt-> store_result();執行後..但我不知道它現在和以前從未需要..

回答

1
每個

功能mysqli的/方法可以失敗。根據您的擴​​展方式class mysqli,您可能需要測試每個返回值。如果方法返回false發生錯誤,並且錯誤消息存儲在mysqli或語句對象的屬性中。

$sql="SELECT PhotoID,Caption FROM Photos WHERE EntityID=? AND TypeID=? LIMIT ?,?"; 

$iDB = new mysqliDB(); // Extends mysqli 
if ($iDB->connect_error) { 
    printf('connect error (%d) %s', $iDB->connect_errno, htmlspecialchars($iDB->connect_error)); 
    die; 
} 

$stmt = $iDB->prepare($sql); 
if (false===$stmt) { 
    printf('prepare failed: %s', htmlspecialchars($iDB->error)); 
    die; 
} 

$rc = $stmt->bind_param('iiii',$entityID,$typeID,$minRange,$maxRange); 
if (false===$rc) { 
    printf('bind_param failed: %s', htmlspecialchars($stmt->error)); 
    die; 
} 

$rc = $stmt->execute(); 
if (false===$rc) { 
    printf('execute failed: %s', htmlspecialchars($stmt->error)); 
    die; 
} 

$rc = $stmt->bind_result($photoID,$caption); 
if (false===$rc) { 
    printf('bind_result failed: %s', htmlspecialchars($stmt->error)); 
    die; 
} 

// echo("Affected={$stmt->affected_rows}"); 
+0

謝謝,我從來沒有想過這樣調試 - 我一直認爲它只是execute(),通常會出錯 – pws5068 2010-03-31 00:10:32

1

mysqli_stmt->affected_rows文件:

此功能只能查詢工作,其更新表爲了從SELECT查詢中獲取行數,請改爲使用mysqli_stmt_num_rows()

所以,你只能使用此方法的UPDATEDELETE查詢。

此外:

返回值 大於零的整數表示受影響或檢索的行數。零表示沒有記錄更新UPDATE/DELETE語句,沒有行與查詢中的WHERE子句匹配,或者沒有查詢尚未執行。 -1表示查詢返回了錯誤。 NULL表示提供給函數的參數無效。

但是,這也意味着它,因爲你嘗試使用它的SELECT語句返回-1。試試mysqli_stmt_num_rows()

更新:

實施例形成我鏈接到頁面:

$query = "SELECT Name, CountryCode FROM City ORDER BY Name LIMIT 20"; 
if ($stmt = $mysqli->prepare($query)) { 

    /* execute query */ 
    $stmt->execute(); 

    /* store result */ 
    $stmt->store_result(); 

    printf("Number of rows: %d.\n", $stmt->num_rows); 

    /* close statement */ 
    $stmt->close(); 
} 
+0

我知道這個,但是什麼錯誤?聲明很好,並且值正確填充。 – pws5068 2010-03-30 23:04:52

+0

@ pws5068:當你使用'mysqli_stmt_num_rows'時結果如何? – 2010-03-30 23:06:43

+0

始終爲零,但也許我錯誤地使用了它? $ stmt-> execute(); die(「Rows =」.mysqli_stmt_num_rows($ stmt)); – pws5068 2010-03-30 23:12:14