2013-03-01 8 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 идентификатор базы данных ($ st2-> affected_rows равна нулю). Что в этом плохого?

P.S. Не настоящий код, но он полностью описывает проблему.

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

mysqli не дает ошибок. –

+0

Да, PDO намного лучше, спасибо –

-1

Согласно документации bind_result должна быть вызвана до выполнения:

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

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

Ничего не изменилось, код по-прежнему распечатывает привязанные идентификаторы, но запрос на обновление не работает. –

Смежные вопросы