2010-03-30 110 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