Php 变量为';当被Ajax调用时,t被视为对象
我有一个投票,当用户单击其中一个选项时,它会通过ajax发送数据:Php 变量为';当被Ajax调用时,t被视为对象,php,jquery,pdo,Php,Jquery,Pdo,我有一个投票,当用户单击其中一个选项时,它会通过ajax发送数据: $.ajax({ type: 'POST', url: '/poll.php', data: {option: option, IDpoll: IDpoll}, dataType: 'json', async: false, error: function(xhr, status, error) { alert(xhr.responseText);
$.ajax({
type: 'POST',
url: '/poll.php',
data: {option: option, IDpoll: IDpoll},
dataType: 'json',
async: false,
error: function(xhr, status, error) {
alert(xhr.responseText);
},
success: function(data) {
if(data.msg == "0") {
$( "#pollArea" ).load( "/pollVote.php", { allow: true }, function() {
alert( "Ďakujeme za Váš hlas!" );
});
}
else {
alert(data.msg);
alert("V tejto ankete ste už hlasovali.");}
}
});
这个很好用。现在数据被传递到poll.php文件:
if (isset($_POST['option']) && isset($_POST['IDpoll'])) {
require 'includes/config.inc.php';
$ip = $_SERVER['REMOTE_ADDR'];
$option = $pdo->quote($_POST['option']);
$IDpoll = $pdo->quote($_POST['IDpoll']);
$date = date("d.m.Y H:i:s");
$poll = new Poll();
$msg = $poll->votePoll($IDpoll, $ip, $option, $date);
$arr = array(
'msg' => $msg
);
echo json_encode($arr);
这也是可行的,问题发生在类Poll-方法VotePoll中:
public function votePoll($IDpoll, $ip, $option, $date)
{
try {
$query = "SELECT * FROM `votes` WHERE `IDpoll` = '$IDpoll' AND `ip` = '$ip'";
$result = $this->pdo->query($query);
if ($result->rowCount() == 0) {
/* do stuff */
}
catch (PDOException $e) {
return $e->getMessage();
}
}
来自ajax调用的错误消息如下:调用非对象上的成员函数rowCount()。我知道这条消息的意思,但我不明白为什么变量$result不被视为PDO对象。奇怪的是,当我尝试手动调用函数votePoll时,它工作得很好,当我对结果使用var_dump时,它就是PDO对象。那么错误在哪里呢
编辑:我忘了说我只是在编辑这个函数。最初它与mysqli一起工作,但我想切换到pdo(所以查询和类似的东西都没问题)。所以,问题出在以下几行:
$option = $pdo->quote($_POST['option']);
$IDpoll = $pdo->quote($_POST['IDpoll']);
PDO quote函数向字符串添加引号,使选项变为“option”等。然后将其发送到查询添加了其他引号的位置,因此结果为“option”,这就是错误。可能不重要,但votePoll函数中存在语法错误:if未正确关闭,除非您没有正确复制它。无论如何,查询似乎失败了。也许有什么不对劲?如果$result不是对象,那么查询可能不会返回任何内容。是的,我复制错了,括号没有丢失(这种错误会在IDE中显示)。我确信查询是可以的,因为正如我所说的,当我尝试手动调用该函数时,它工作了,$result是object。那么您是否尝试过检查$IDPoll和$option是否都被正确检索?试着把它们记录下来。你是对的。我有。我将编写解决方案,谢谢。我将与briosheje一起检查您的查询,以确保字符串中正确包含
IDpoll
。发送时,IDPoll
是字符串吗?(旁注:我通常在PHP中使用预先准备好的语句,只要我在客户端UI中或仅通过手动创建/修改请求将可能被用户触及的数据插入数据库中)就不会添加转义引号,因此,与其插入“选项”
,不如插入“选项”
,这是有效的(如果不完全是所需的行为)?