假设我们有一个包含字段'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等于零)。它有什么问题?
附注:不是真正的代码,但它完全描述了问题。
发布于 2013-03-01 19:46:51
它有什么问题?
由于某些原因,您没有对execute进行错误检查。
$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-01 19:43:31
根据文档,在执行之前必须调用bind_result:
$st->bind_result($id) ;
$st->execute() ;
while ($st->fetch()) {
$st2->bind_param('i', $id) ;
$st2->execute() ;
echo $id.'<br/>' ;
}https://stackoverflow.com/questions/15156862
复制相似问题