-1

SO コミュニティの多くの人々のおかげで、私はすべてを PDO に切り替えようとしました。PDO に変換しようとした INSERT INTO ステートメントがありますが、挿入されません。エラーも発生していません。

これが私が変換しようとしていたものです:

<?php
session_start();
$con = mysql_connect("host", "username", "password", "DBname"); 
$username = $_SESSION['username'];
if (!$con)
  {
  die('Could not connect: ' . mysql_error());
  }

mysql_select_db("dbname", $con);

mysql_query("INSERT INTO badge_status (username, badge1)
VALUES ('$username', 'finished')");

mysql_close($con);
?> 

PDO バージョン

<?php
session_start();
$db = new PDO('mysql:host=hostname;dbname=dbname;charset=UTF-8', 'username', 'password');
$username = $_SESSION['jigowatt']['username'];
$awardFinished = $db->prepare('INSERT INTO badge_status (username, badge1) VALUES ('$username', 'finished')');
?>

何が起こっているのかを把握できるか、これを修正できるかどうかに感謝します!

4

2 に答える 2

10

でステートメントを準備したら$awardFinished = $db->prepare(...);、それを実行する必要があります。

$awardFinished->execute();

また、これが投稿のエラーなのか実際のコードのエラーなのかはわかりませんが、ここでは無効な単一引用符が使用されています。

$db->prepare('INSERT INTO badge_status (username, badge1) VALUES ('$username', 'finished')');

それを修正しても、準備済みステートメントを使用しています。変数をクエリに直接挿入しないでください。

次のように更新してみてください。

$awardFinished = $db->prepare('INSERT INTO badge_status (username, badge1) VALUES (:username, "finished")');
$awardFinished->execute(array(':username' => $username));
于 2012-11-08T20:29:27.487 に答える
2

最初に目にする問題は、クエリ内の一重引用符です。エスケープする必要があります。

'INSERT INTO badge_status (username, badge1) VALUES (\'$username\', \'finished\')'

execute次に、次のステートメントが必要です。

$awardFinished->execute();

次のような例外をスローするように PDO に指示する必要があるため、エラーは発生しません。

$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try {
    // .. prepare ..
    $awardFinished->execute();
} catch (PDOException $e) {
    echo $e->getMessage();
}
于 2012-11-08T20:35:49.323 に答える