2012-11-08 217 views
-1

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

这是我试图转换:

<?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')'); 
?> 

谢谢!

+0

请阅读使用说明书。你甚至不懂得串联一个字符串。 –

+0

如果您使用的是非常棒的PDO,您必须**使用[SQL占位符](http://bobby-tables.com/php)功能来正确地转义您的数据。不要在有害的不安全的'mysql_query'风格中使用它。 – tadman

+0

我已经拥有了,如果没有,我不会发布。手册没有许多人想象的那么有用。 –

回答

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

这工作!非常感谢。我可以用真实的有形代码更快地学习这些东西。 10分钟限制过后,我会接受这个答案。再次,谢谢你! –

+0

@AoiHana完全没问题,我很高兴能帮忙! – newfurniturey

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

刚刚看到newfurniturey的答案......现货 – Lex

+1

非常感谢!这也适用。非常感谢您的帮助! –