0

假设我们有一个包含字段 'id' 和 'num' 的表 'item',还有一个像下面这样不起作用的代码。

$db = new mysqli('localhost', 'user', 'pass', 'db') ;
if (!$st  =  $db->prepare('select id from item')) die($db->error) ;
if (!$st2 =  $db->prepare('update item set num = 1 where id = ?')) die($db->error) ;

$st->execute() ;
$st->bind_result($id) ;

while ($st->fetch()) {

    $st2->bind_param('i', $id) ;
    $st2->execute() ;
    echo $id.'<br/>' ;
}

它只是打印出类似^ 1 2 3 的内容,但不会更改数据库的id($st2->affected_rows 等于零)。它出什么问题了?

PS 不是真正的代码,但它完全描述了问题。

4

2 回答 2

1

它出什么问题了?

由于某种原因,您没有执行错误检查。

$st2->execute() or trigger_error($db->error);

会告诉你查询是否有错误。
如果没有 - 检查您检查更新值的方式。

顺便说一句,您的代码的更好版本

$dsn = 'mysql:host=localhost;dbname=db;charset=utf8';
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC
);
$pdo = new PDO($dsn,'user','pass', $opt);

$sth = $db->prepare('select id from item');
$sth->execute();
$ids = $sth->fetchAll();

$sth = $db->prepare('update item set num = 1 where id = ?');
foreach ($ids as $row) {
    $sth->execute($row['id']);
}
于 2013-03-01T11:46:51.270 回答
-1

根据文档 bind_result 必须在执行之前调用:

$st->bind_result($id) ;
$st->execute() ;
while ($st->fetch()) {

    $st2->bind_param('i', $id) ;
    $st2->execute() ;
    echo $id.'<br/>' ;
}
于 2013-03-01T11:43:30.783 回答