-1

感谢 SO 社区中的许多人,我一直在尝试将所有内容都切换到 PDO。我有一个 INSERT INTO 语句,我尝试转换为 PDO,但它没有插入。我也没有收到任何错误。

这是我试图转换的内容:

<?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 回答