【问题标题】:Variable isn't considered as object when called by Ajax被 Ajax 调用时变量不被视为对象
【发布时间】:2014-08-26 16:05:04
【问题描述】:

我有一个投票,当用户点击其中一个选项时,它会通过 ajax 发送数据:

$.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(所以查询和类似的东西都可以)。

【问题讨论】:

  • 也许不重要,但是您的 votePoll 函数中存在语法错误:if 没有正确关闭,除非您没有正确复制它..! prntscr.com/4go8mq 。无论如何,查询似乎失败了。也许那里有问题?如果 $result 是 not 对象,则查询可能 not 返回任何内容。
  • 是的,我复制错了,括号没有丢失(我的 IDE 会显示这种错误)。我确信查询没问题,因为正如我所说,当我尝试手动调用该函数时,它可以工作并且 $result 是对象。
  • 那么您是否尝试过检查 $IDPoll 和 $option 是否真的被正确检索? 尝试将它们记录回来。
  • 你是对的。我有它。要写解决方案,谢谢。
  • 与 briosheje 一起,我会检查您的查询,以确保 IDpoll 正确包含在字符串中。 IDPoll 发送时是一个字符串吗? (旁注:每当我将数据插入数据库时​​,我通常会在 PHP 中使用准备好的语句,这些数据可能会被用户触摸,无论是在客户端 UI 中还是仅通过手动创建/修改请求)

标签: php jquery pdo


【解决方案1】:

所以,这个问题出在以下几行:

   $option = $pdo->quote($_POST['option']);
   $IDpoll = $pdo->quote($_POST['IDpoll']);

PDO 引用函数在字符串中添加引号,因此选项变为“选项”等。然后将其发送到查询添加了额外引号的位置,因此结果为“选项”,即错误。

【讨论】:

  • 不会 quote() 添加转义引号,因此不是插入 ''option'',而是插入 '\'option\'',这是有效的(如果不是完全期望的行为)?
猜你喜欢
  • 2014-12-02
  • 1970-01-01
  • 2017-06-19
  • 2022-12-22
  • 2017-08-17
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2016-01-13
相关资源
最近更新 更多