【问题标题】:mysqli bind_parammysqli 绑定参数
【发布时间】:2013-03-01 11:40:42
【问题描述】:

让我们假设我们有一个包含字段“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 但是数据库没有任何更改($st2->affected_rows 等于零)。 它有什么问题?

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

【问题讨论】:

  • 发布不是真正的代码并询问它有什么问题是相互排斥的。

标签: php mysqli


【解决方案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']);
}

【讨论】:

    【解决方案2】:

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

    $st->bind_result($id) ;
    $st->execute() ;
    while ($st->fetch()) {
    
        $st2->bind_param('i', $id) ;
        $st2->execute() ;
        echo $id.'<br/>' ;
    }
    

    【讨论】:

    • 什么都没有改变,代码仍然打印出绑定的id,但是更新查询不起作用。
    猜你喜欢
    • 2015-10-01
    • 2010-12-03
    • 2012-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-27
    • 2016-08-31
    相关资源
    最近更新 更多