我正在尝试允许用户对我网站上的个人资料发表评论。我有以下 php - 更新:
<?php
// Insert Comments into Database that user provides
$comm = mysql_real_escape_string($_POST['addComment']);
$pID4 = filter_input(INPUT_GET, 'pID', FILTER_SANITIZE_NUMBER_INT);
$cID = mysql_real_escape_string($_POST['courseInfoDD']);
$username = "###";
$password = "####";
$pdo4 = new PDO('mysql:host=localhost;dbname=###', $username, $password);
$pdo4->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:info, :pID, :cID)
');
$sth3->execute(array(
':info' => $comm, ':pID' => $pID3, ':cID' => $cID
));
?>
数据库表“评论” http://postimage.org/image/16sbr0jd0/(主持人请将此转换为显示图片)
HTML:
<input type='text' id='addComment' name='addComment' tabindex='3' value='Enter comment' />
错误:
No pID specified
。当我尝试插入评论时。
答案 0 :(得分:4)
您在insert语句中使用单引号:
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES($comm, $pID3, $cID)
');
使用这些简单的引号, $comm
将不会被评估 - 并且文字$comm
字符串将被发送到数据库 - 导致您可能不喜欢的内容我非常期待。
如果要插入变量,则应使用double-quotes around your string。
但是,因为你试图使用准备好的陈述,而不是你应该做的,实际上。
相反,您应该在语句中使用占位符 - 然后在执行语句时将这些占位符绑定到您的数据。
我认为你的prepare
看起来有点像这样:
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:comm, :pID3, :cID)
');
请注意:comm
,:pID3
和:cID
占位符。
然后,在执行语句时,您实际上会传递一些实际数据,以对应占位符:
$ sth3-&GT;执行(阵列( ':comm'=&gt; $通讯, ':pID3'=&gt; $ PID3, ':cID'=&gt; $ CID, ));
附加说明:当您使用准备好的语句时,您不必使用mysql_real_escape_string()
(这不是与PDO相关的功能,BTW,并且只应在使用mysql_*
函数):转义是由准备好的声明mecanism本身处理的。
答案 1 :(得分:1)
PDO预处理语句的参数应该像这样使用:
$sth3 = $pdo3->prepare('
INSERT INTO Comment (info, pID, cID)
VALUES(:info, :pID, :cID)
');
$sth3->execute(array(
':info' => $comm, ':pID' => $pID3, ':cID' => $cID
));
首先为值设置“slots”,然后在运行查询时提供它们。
答案 2 :(得分:0)
单引号字符串中的$变量未被处理。请改用双引号并为SQL语句本身添加引号:
$sth3 = $pdo3->prepare("
INSERT INTO Comment (info, pID, cID)
VALUES('$comm', '$pID3', '$cID')
");
答案 3 :(得分:0)
我们的问题与mysql没有任何关系,没有评论。
这是基本的PHP字符串语法。
如果要在字符串中解释变量,请使用双引号。
但是,您不应该直接将变量添加到查询中,而应该将它们加入