[英]I cannot figure out why I am getting this MySQL syntax error (PHP PDO) (MySQL)
我正在嘗試對MySQL數據庫進行簡單插入,但是出現以下語法錯誤:
Fatal error: Uncaught PDOException: SQLSTATE[42000]: Syntax error or access
violation: 1064 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
'Combined Authority - ICT Service Desk Technician (WYCA 53) ' at line 2
為什么?
查詢:
$conn->exec("INSERT INTO jobs (jobname, category, contract, link)
SELECT * FROM (" . $name[$i] . "," . $category[$i] . "," . $contract[$i]
. "," . $link[$i] . ") AS tmp
WHERE NOT EXISTS (
SELECT link FROM jobs WHERE link = '" . " " . $link[$i] . ") LIMIT 1;");
$ sql打印:
INSERT INTO jobs (jobname, category, contract, link) SELECT * FROM ( West
Yorkshire Combined Authority - ICT Service Desk Technician (WYCA 53)
Details ,' Other ',' Other
','https://bradford.engageats.co.uk/ViewVacancyV2.aspx?
enc=mEgrBL4XQK0+ld8aNkwYmF3VpPuSfX9mpz94c96U/BBgu1IZbwnQ0d+smFL6YrlPhdWkSGi559WmVou+xCXKsYHbHKP0EyHRCwf+vYTu8aYRJbtJgz78Wm2KQgu+LktushGT2Rg0PHjiRMA2Xyn4gw==') AS tmp WHERE NOT EXISTS ( SELECT link FROM jobs WHERE link ='https://bradford.engageats.co.uk/ViewVacancyV2.aspx?enc=mEgrBL4XQK0+ld8aNkwYmF3VpPuSfX9mpz94c96U/BBgu1IZbwnQ0d+smFL6YrlPhdWkSGi559WmVou+xCXKsYHbHKP0EyHRCwf+vYTu8aYRJbtJgz78Wm2KQgu+LktushGT2Rg0PHjiRMA2Xyn4gw==') LIMIT 1;
抱歉,上面的格式不正確。 請復制並粘貼到文本編輯器中,以更好地查看它。
編輯:
奇怪的是,此查詢適用於偽值,但仍不適用於數組
INSERT INTO jobs (jobname, category, contract, link)
SELECT * FROM (SELECT 'Test', 'Test2',
'Test3','https://bradford.engageats.co.uk/ViewVacancyV2.aspx?
enc=mEgrBL4XQK0+ld8aNkwYmEUlxXraCLcDtY5P6rS92ks+pMDnlWa9QO6M/Df/HLticzgbgVWV
YayJj+zNDXalJnejkDY/4/gH0pIF9KyvMFXjn0u0quGSUzf4M/Gh0wF0MqIRgwLERFf+xXj6lw4s
tQ==') AS tmp
WHERE NOT EXISTS (
SELECT link FROM jobs WHERE link = 'https://bradford.engageats.co.uk/ViewVacancyV2.aspx?enc=mEgrBL4XQK0+ld8aNkwYmEUlxXraCLcDtY5P6rS92ks+pMDnlWa9QO6M/Df/HLticzgbgVWVYayJj+zNDXalJnejkDY/4/gH0pIF9KyvMFXjn0u0quGSUzf4M/Gh0wF0MqIRgwLERFf+xXj6lw4stQ=='
) LIMIT 1;
試試這個選擇查詢,並與其他變量相同:
SELECT * FROM ("'".$name[$i]."','".$category[$i]."', '".$contract[$i] ."', '". $link[$i] ."'") AS tmp
對於行和表名,使用引號表示字符串文字反引號。
有關更多參考,請檢查: http : //php.net/manual/zh/pdo.errorinfo.php
我可以發現三個不同的問題:
首先,您正在發明自己的SQL語法,並且服務器沒有被逗樂。 您不能SELECT * FROM (anything you want)
。 您只能從表,視圖或子查詢中選擇。
其次,當您在SQL中鍵入例如foo
時,數據庫引擎需要一種方法來弄清楚是表還是列還是字面值。 使用的方法是單引號 :
SELECT foo AS this_is_a_column, 'foo' AS this_is_a_value FROM bar
您可以在以下位置找到更多詳細信息: 標識符和文字之間的區別是什么?
最后但並非最不重要的一點是,您對PDO擴展程序的整體使用是錯誤的。 PDO提供了一種分離代碼和數據的方法,但是您沒有使用它。 而不是這樣:
$conn->exec("SELECT link FROM jobs WHERE link = '" . " " . $link[$i] . ") LIMIT 1;");
...您應該做這樣的事情:
$stmt = $conn->prepared("SELECT link FROM jobs WHERE link=? LIMIT 1"); $stmt->execute($stmt, array($link[$i]));
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.