2013-03-01 57 views
0

让我们假装我们有一个'item'字段'id'和'num'以及下面的代码不起作用的表。mysqli bind_param

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

它只是打印出像^ 但没有改变需要plase ID数据库($ st2-> affected_rows等于零)。 它有什么问题?

P.S.不是真正的代码,但它完全描述了这个问题。

+0

发布不是真正的代码,并询问有什么不妥的是相当互斥。 – 2013-03-01 11:44:05

回答

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']); 
} 
+0

mysqli不会给出错误。 – 2013-03-01 12:15:28

+0

是的,PDO好多了,谢谢 – 2013-03-01 12:16:00

-1

根据文档bind_result有之前调用执行:

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

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

没有任何改变,代码仍然打印绑定的ID,但更新查询无效。 – 2013-03-01 11:48:16