0

フィールド '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 はゼロに等しい)。どうしたの?

PS実際のコードではありませんが、問題を完全に説明しています。

4

2 に答える 2

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']);
}
于 2013-03-01T11:46:51.270 に答える
-1

ドキュメントによると、実行する前にbind_resultを呼び出す必要があります。

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

    $st2->bind_param('i', $id) ;
    $st2->execute() ;
    echo $id.'<br/>' ;
}
于 2013-03-01T11:43:30.783 に答える