簡體   English   中英

我無法弄清楚為什么出現此MySQL語法錯誤(PHP PDO)(MySQL)

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM