2017-04-18 177 views
0

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

$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 
} 
+1

试图通过一个变量,而不是'$ _ POST [“用户ID”]',你也可以通过你的连接'$ dbh->的setAttribute(PDO :: ATTR_ERRMODE,PDO后添加此启用错误方式: :ERRMODE_EXCEPTION);' –

+0

直接在数据库中运行查询以查看是否出现错误。 – TurtleTread

+0

已经说过它对数据库正确工作 –

回答

0

你不能在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); 
0

尝试添加括号到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