让我们假设我们有一个表'item',其中包含字段'id'和'num'以及下面不能使用的代码。
$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 但是没有任何更改需要数据库($ st2-&gt; affected_rows等于零)。 怎么了?
P.S。不是真正的代码,但它完全描述了问题。
答案 0 :(得分: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']);
}
答案 1 :(得分:-1)
根据文档,必须在执行之前调用bind_result:
$st->bind_result($id) ;
$st->execute() ;
while ($st->fetch()) {
$st2->bind_param('i', $id) ;
$st2->execute() ;
echo $id.'<br/>' ;
}