mysqli bind_param

时间:2013-03-01 11:40:43

标签: php mysqli

让我们假设我们有一个表'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。不是真正的代码,但它完全描述了问题。

2 个答案:

答案 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/>' ;
}