2017-10-30 16 views
1

に非オブジェクトのプロパティを取得しようとすると:は、私は次のSQLクエリを持つSQLクエリ

SET @rank=0; SELECT receivedData.* FROM (SELECT @rank:[email protected]+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1; 

私は自分のサーバー上で私のphpMyAdminでこれを実行すると、すべてが正常に動作します。

しかし、私はPHPでそれを実行したとき、私は次のエラーを取得する:

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'SELECT receivedData.* FROM (SELECT @rank:[email protected]+1 AS rank, ID FROM data ORDER BY' at line 1

$sql2 = "SET @rank=0; SELECT receivedData.* FROM (SELECT @rank:[email protected]+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;"; 
$result = $conn->query($sql2) or die($conn->error); 

パトリックはあなたを示唆したように、それはPHP

+2

これらを2つの異なるコマンドで実行する必要があります。 –

+0

値の回りに ''テーブル名とカラム名と引用符の回りにバッククォートを使ってみてください。その可能性は、データベースがどちらがどちらであるかを知らない可能性があります。 – Chris

+0

@ PatrickQどうしたらうまくいくのですか? –

答えて

3

では動作しませんなぜ私は本当に得ることはありません試してみることができます:

$sSQL = "SET @rank=0;"; 

if($conn->query($sSQL)){ 
    $sSQL = "SELECT receivedData.* FROM (SELECT @rank:[email protected]+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;"; 
    $conn->query($sSQL); 
} 

$conn->query()は、一度に1つのコマンドだけを実行します。マニュアル: "PDO :: query()は、単一の関数呼び出しでSQL文を実行し、その文によって返された結果セット(ある場合)をPDOStatementオブジェクトとして返します。

接続を再利用しているため、クエリは引き続きローカルvarにアクセスする必要があります。

+0

説明してくれてありがとう! –

+0

あなたの歓迎ですが、これで問題が解決した場合は、受け入れられた回答としてマークしてください。 – atoms

+0

おっと、ごめんなさい.. –

1

これらの2つのクエリを組み合わせることができます。 PDO

SELECT 
    receivedData.* 
FROM (
    SELECT 
    @rank := @rank + 1 AS rank 
    , ID 
    FROM 
    data 
    CROSS JOIN (SELECT @rank := 0) as init_user_param 
    ORDER BY 
    Eindtijd ASC 
) 
    AS receivedData 
ORDER BY ID DESC LIMIT 1; 
1

の中へ

SET @rank=0; 
SELECT 
    receivedData.* 
FROM (
    SELECT 
    @rank := @rank + 1 AS rank 
    , ID 
    FROM 
    data 
    ORDER BY 
    Eindtijd ASC 
) 
    AS receivedData 
ORDER BY ID DESC LIMIT 1; 

あなたはこれを行うことができます。最初のクエリから返すためには何もないよう

$db = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', 'password'); 

$statement = $db->prepare('SET @rank = "1"; SELECT receivedData.* FROM (SELECT @rank:[email protected]+1 AS rank, ID FROM data ORDER BY Eindtijd ASC) AS receivedData ORDER BY ID DESC LIMIT 1;'); 

$statement->execute(); 

do { 
    $data = $statement->fetchAll(\PDO::FETCH_ASSOC); 
    var_dump($data); 

} while ($statement->nextRowset()); 

最初の返された配列は空になります。 2番目に返された配列はデータを保持します。

関連する問題