【问题标题】:PDO returning empty result [duplicate]PDO返回空结果[重复]
【发布时间】:2017-04-18 21:14:14
【问题描述】:

我有下面的 PHP 脚本,它生成一个 MySQL 查询并运行它,但是目前该查询返回一个空结果。

$sth = $dbh->prepare("SELECT TeamID FROM UserTeam WHERE UserID=? AND Deleted IS NULL");
            $sth->execute(array($_POST['userID']));
            $teams = $sth->fetchAll();

            $sql = "SELECT * FROM Event WHERE UserID=? AND Deleted IS NULL";

            if (count($teams) > 0) {
                $sql .=  " OR TeamID IN (";
                foreach ($teams as $team){
                    $sql .= $team['TeamID'] . ",";
                }

                $sql = substr($sql, 0, -1);

                $sql .=  ")";
            }

            $sql .= " ORDER BY Created DESC LIMIT ?, 10 ";

            $sth = $dbh->prepare($sql);
            $sth->execute(array($_POST['userID'], $_POST['start']));
            $events = $sth->fetchAll();

            $response["success"] = 1;
            $response["result"] = $events;
            $response["sql"] = $sql;
            $response["post"] = $_POST;
            echo json_encode($response);

例如给出输出 JSON 数组:

{
  "post" : {
    "start" : "0",
    "userID" : "33"
  },
  "result" : [

  ],
  "sql" : "SELECT * FROM Event WHERE UserID=? AND Deleted IS NULL OR TeamID IN (12,13,17) ORDER BY Created DESC LIMIT ?, 10 ",
  "success" : 1
}

但是,如果我手动对数据库运行生成的查询(将 ? 替换为正确的值),我会得到预期的结果(返回 10 个结果)

更新

甚至将 SQL 生成更改为硬编码值而不是 ?我还是没有结果。

{
  "post" : {
    "start" : "0",
    "userID" : "33"
  },
  "result" : [

  ],
  "sql" : "SELECT * FROM Event WHERE UserID=33 AND Deleted IS NULL OR TeamID IN (12,13,17) ORDER BY Created DESC LIMIT 0, 10 ",
  "success" : 1
}

【问题讨论】:

  • 尝试传递一个变量而不是$_POST['userID'] ,您也可以通过在连接后添加这个$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);来启用错误模式
  • 直接在数据库中运行查询,看看是否有错误。
  • 已经说过它对数据库正常工作

标签: php mysql pdo


【解决方案1】:

您不能在LIMIT 子句中使用占位符。你也不需要,因为它是一个很容易变得安全的整数。此外,您可以从第一个查询中获取列,以便更轻松地构建您的第二个查询。我怀疑这可以通过单个查询获取,但如果没有看到您的数据库架构,就无法确定。

最后,您没有从数据库代码中发现任何错误,因此您无法知道是否会成功。假设您正确设置了连接,您应该能够捕获任何异常。

<?php
try {
    $sth = $dbh->prepare("SELECT TeamID FROM UserTeam WHERE UserID=? AND Deleted IS NULL");
    $sth->execute([$_POST["userID"]]);
    $teams = $sth->fetchAll(PDO::FETCH_COLUMN, 0);
} catch (PDOException $e) {
    // do something here
}
$start = (int)$_POST["start"];

$sql = "SELECT * FROM Event WHERE UserID=? AND Deleted IS NULL";

if (count($teams) > 0) {
    $sql .=  " OR TeamID IN (" . implode(",", $teams) . ")";
}

$sql .= " ORDER BY Created DESC LIMIT $start, 10";

try {
    $sth = $dbh->prepare($sql);
    $sth->execute([$_POST["userID"]]);
    $events = $sth->fetchAll();
} catch (PDOException $e) {
    // do something here
}
$response["success"] = 1;
$response["result"] = $events;
$response["sql"] = $sql;
$response["post"] = $_POST;
header("Content-Type: application/json");
echo json_encode($response);

【讨论】:

    【解决方案2】:

    尝试在您的 sql 查询中添加括号。例如,而不是:

    SELECT * FROM Event WHERE UserID=33 AND Deleted IS NULL OR TeamID IN (12,13,17) ORDER BY Created DESC LIMIT 0, 10 
    

    尝试:

    SELECT * FROM Event WHERE UserID=33 AND (Deleted IS NULL OR TeamID IN (12,13,17)) ORDER BY Created DESC LIMIT 0, 10 
    

    【讨论】:

      【解决方案3】:

      我正在使用 LIMIT 的占位符返回结果,就像这样

          public function list_stuff(int $max)
          {
              $sql = 'SELECT *
      FROM mytable
      LIMIT :thelimit';
              $set_sql = $this->pdo->prepare($sql);
              $set_sql->bindValue(':thelimit', $max, \PDO::PARAM_INT);
              $set_sql->execute();
              return $set_sql->fetchAll(\PDO::FETCH_ASSOC);
          }
      

      【讨论】:

      猜你喜欢
      • 2016-01-28
      • 2013-09-27
      • 2015-02-24
      • 2015-08-26
      • 2012-12-22
      • 2018-09-08
      • 2014-05-01
      • 2012-11-21
      • 1970-01-01
      相关资源
      最近更新 更多