2013-03-01 56 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