2015-11-03 163 views
0

我真的很困惑來自我的簡單插入的錯誤。我已經用不同的檢查器多次檢查了這個語法,並且搜索了類似的麻煩,但是還沒有找到解決方法。SQLSTATE [42000]:語法錯誤,但語法正常

的錯誤看起來是這樣的:

'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 ' , , , , , , , , , , , , , ,)' at line 1' in 

而且我的代碼基本上是這樣的:

$yhteys = new PDO('mysql:host=localhost;dbname=XXXX', 'YYYY', 'ZZZZ'); 
$kysely = $yhteys->prepare("INSERT INTO hakija (Kutsumanimi, Etunimet, Sukunimi, SyntymAika, Syntymapaikka, Sahkoposti, Puhelinnumero, Postiosoite, Postinumero, Postitoimipaikka, Maa, Suosittelija, IPos, Lahetysaika, Vapaa_sana, Sosme) VALUES ($nimi, $etunimet, $sukunimi, $saika, $spaikka, $email, $puhelin, $osoite, $postinro, $postitmp, $maa, $suosittelija, $IPos, $lahetysaika, $vapaasana, $sosme)"); 
$kysely->execute(); 

如果我直接使用INSERT通過phpMyAdmin的,它的工作原理,但是從PHP ..任何人都可以幫幫我?

PHP:原生(5.4) 的MySQL 5.6

+0

你確定你的變量是不是空的?它看起來是這樣的,但我沒有重現它.. 也考慮到兩個答案:你必須封裝字符串與單個問題,總體而言,你應該使用預先準備好的語句(爲了安全和方便)。 –

+0

不確定,某些變量可能爲空,因爲它們不是必需的。 – tlaxin

+0

好的。按照RafH的建議使用準備好的語句。這種方式應該可以,如果他們是空的,再加上它是一個必須出於安全原因(http://stackoverflow.com/questions/732561/why-is-using-a-mysql-prepared-statement-more-secure-than -using-the-common-escape) –

回答

1

您應該使用準備好的語句。這將防止SQL注入,你不會要處理的變量類型

$yhteys = $dbh->prepare("INSERT INTO hakija (Kutsumanimi, Etunimet,...) VALUES (:kutsumanimi, :ktunimet, ...)"); 
$yhteys ->bindParam(':kutsumanimi', $kutsumanimi); 
$yhteys ->bindParam(':ktunimet', $ktunimet); 
... 
$yhteys ->execute(); 

看看這裏:http://php.net/manual/en/pdo.prepared-statements.php

+0

謝謝,這是解決方案。 – tlaxin

0

如果插入值都是字符串,你需要放在引號

$kysely = $yhteys->prepare("INSERT INTO hakija (Kutsumanimi, Etunimet, Sukunimi, SyntymAika, Syntymapaikka, Sahkoposti, Puhelinnumero, Postiosoite, Postinumero, Postitoimipaikka, Maa, Suosittelija, IPos, Lahetysaika, Vapaa_sana, Sosme) VALUES ('$nimi', '$etunimet', '$sukunimi', '$saika', '$spaikka', '$email', '$puhelin', '$osoite', '$postinro', '$postitmp', '$maa', '$suosittelija', '$IPos', '$lahetysaika', '$vapaasana', '$sosme')"); 

如果值是整數,則可以跳過報價

相關問題