2017-04-18 9 views
0

私はMySQLのクエリを生成して実行する以下のPHPスクリプトを持っていますが、現在クエリは空の結果を返しています。 (手動で私が期待される結果を取得していますPDOが空の結果を返す

{ 
    "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 
} 

私は生成されたクエリを実行する場合は(正しい値に置き換え?)データベースに対して:

$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配列を与える例えばです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句でプレースホルダを使用することはできません。それは簡単に安全にできる整数なので、あなたもする必要はありません。さらに、最初のクエリーから列をフェッチして、2番目のクエリーをより簡単に作成することができます。私はこれが単一のクエリでフェッチできると思うが、あなたのデータベーススキーマを見ることなく確実に言うことはできない。

最後に、データベースコードからエラーをキャッチしていないため、成功するかどうかわかりません。接続を適切に設定すると、例外を捕捉できるはずです。

<?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 
関連する問題