2017-10-17 8 views
0

こんにちはすべて私はこのエラーを取得していますページをロードするには非常にシンプルな私はうまくいかないそれは何ですか私はそれがそれを言うことを知っているが、私は大いに歓迎されるどんな助けにも悩まされていますORGER BY epg_data.start DESC 'on line 6

あなたはSQL構文に誤りがあります。ライン6

$query_Recordset1 = "SELECT streams.id, epg_data.lang, epg_data.start, epg_data.end, epg_data.description, streams_sys.stream_status, streams.stream_display_name, streams.stream_icon, epg_data.title AS epg_title 
    FROM ((streams_sys 
    LEFT JOIN streams ON streams.id=streams_sys.stream_id) 
    RIGHT JOIN epg_data ON epg_data.channel_id=streams.channel_id) 
    WHERE streams.id=".$_GET["id"]." 
AND epg_data.start<NOW() 
AND epg_data.end>'".$_GET["time"]."' 
ORDER BY epg_data.start DESC"; 
+0

デバッグのヒント:これらの変数を(例えば、 'echo $ query_Recordset1')に入れた後に実際のクエリ*を出力してください。すぐに問題を見つけることができます。 (私の推測では '$ _GET [" id "]'は何も返しませんが、あなたの実際のSQLを見ることなく推測します。)また、クエリはSQLインジェクションに対して脆弱です。実際のパラメータで準備されたクエリを使用します。 –

+1

https://en.wikipedia.org/wiki/SQL_injection#Technical_implementations – PeterM

答えて

0

で「epg_data.start DESC BY近く「AND epg_data.start」」ORDERを使用する権利構文についてはMySQLサーバのバージョンに対応するマニュアルを確認してください、私はあなたの$_GET["id"]が値を持たないことを推測しますあなたのSQLステートメントがこのエラーを含むようになりました。

...WHERE streams.id= AND epg_data.start<NOW()... 

これはもちろん構文エラーです。

自分自身に大きな恩恵を与えて、変数をSQLクエリに補間することをやめてください。 SQLインジェクションに関しては安全ではないし、難しすぎる点も多い。代わりに

使用クエリパラメータ:

$query_Recordset1 = " 
SELECT streams.id, epg_data.lang, epg_data.start, epg_data.end, 
epg_data.description, streams_sys.stream_status, streams.stream_display_name, 
streams.stream_icon, epg_data.title AS epg_title 
FROM ((streams_sys 
LEFT JOIN streams ON streams.id=streams_sys.stream_id) 
RIGHT JOIN epg_data ON epg_data.channel_id=streams.channel_id) 
WHERE streams.id=? 
AND epg_data.start<NOW() 
AND epg_data.end>? 
ORDER BY epg_data.start DESC"; 

参照してください?それはずっと簡単です。あなたが内側または外側の引用符を正しく閉じたかどうか疑問に思う必要はもうありません。変数の代わりに?を使用してください。 ?の前後に引用符を入れないでください。パラメータが数値か文字列か日付かは関係ありません。

次に準備して実行します。クエリパラメータを使用して

$stmt = $pdo->prepare($query_Recordset1); 
$stmt->execute([$_GET["id"], $_GET["time"]]); 

は、簡単かつ安全です。クエリパラメータの使用に切り替えていただきありがとうございます。

パラメータは、通常は定数値を使用する場所でのみ使用できます。表名、列名、SQLキーワード、またはその他の式にはパラメーターを使用できません。数字、引用符で囲まれた文字列、または引用された日付のような単一のリテラル値を使用する場所のみ。

+0

「クエリパラメータ」は「Prepared Statements」としてよく知られています。ちょうどその場合、彼はそれらについてもっと多くの情報を検索しようとしていました。良いスタート:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – IncredibleHat

+0

@Randall「クエリパラメータ」は、より具体的に言うと、私はSQLを準備して実行できるのでパラメータを含まない文。しかし、正しいですが、クエリにパラメータが含まれている場合は、prepare()とexecute()を使用する必要があります。 –

+0

いずれにしても、うまくいけば今準備していることを知っていることが質問者の質問に役立ちます:) – IncredibleHat