2017-10-17 64 views
0

嗨,我所有我保持這個錯誤它加載一個很簡單的頁面我不能工作它是什麼,我知道它說,但我難住任何幫助將不勝感激正確的語法的MySQL服務器版本使用附近'和epg_data.start''ORDER BY epg_data.start DESC'在第6行

你有你的SQL語法錯誤;檢查對應於你的MySQL服務器版本正確的語法使用近「AND epg_data.start」「ORDER BY epg_data.start DESC」在行手動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

我猜想,你$_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

「查詢參數」更好地稱爲 - >「準備好的陳述」。以防萬一他試圖搜索關於它們的更多信息。好開始:http://php.net/manual/en/mysqli.quickstart.prepared-statements.php – IncredibleHat

+0

@Randall我說「查詢參數」更具體,因爲可以準備()和執行()一個SQL語句不包含參數。但是你是對的,如果查詢包含參數,則需要使用prepare()和execute()。 –

+0

無論哪種方式,希望知道現在準備將幫助問題提問:) – IncredibleHat

相關問題