2013-06-24 100 views
0

這裏是代碼。 $ fieldNamesA和$ fieldValsA在foreach循環創造了從POST變量:PHP mysqli編寫的插入語句失敗

$fieldNamesS = implode(',',$fieldNamesA); 
$fieldValsS = implode(',',$fieldValsA); 
$mysqli = new mysqli('localhost', 'user', 'pw', 'db'); 
mysqli_report(MYSQLI_REPORT_ALL); 

$stmt = $mysqli->prepare('INSERT INTO users (?) VALUES (?)'); 
if ($stmt === FALSE) { 
    die ("Mysql Error: " . $mysqli->error); 
} 
$stmt->bind_param('ss', $fieldNamesS,$fieldValsS); 
$stmt->execute(); 
printf("%d Row inserted.\n", $stmt->affected_rows); 

/* close statement and connection */ 
$stmt->close(); 

下面是錯誤封郵件:

Fatal error: Uncaught exception 'mysqli_sql_exception' with message '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 '?) VALUES (?)' at line 1' in userreg.php:47 
Stack trace: 
#0 userreg.php(47): mysqli->prepare('INSERT INTO use...') 
#1 {main} 
    thrown in /userreg.php on line 47 

我不明白爲什麼它被抱怨有什麼不對我的插入語句。如果我對列/字段名稱進行硬編碼,則會出現列數與值數不匹配的錯誤,這是不正確的。我var_dumped變量只是爲了確保它們具有相同數量的參數。

回答

1

我不認爲你可以使用PHP Mysqli列名的佔位符。

看看這個答案,它講述了一個PHP類,我寫了擴展mysqli類。它會節省您一些時間,並且它還會執行所有自動佔位符綁定。

better_mysqli class

+0

我硬編碼的列名稱,我得到一個錯誤,指出值的數量不匹配的列,我加倍檢查,並找不到任何錯誤。 – hornswoggle

+0

您是否確定每個專欄有一個佔位符(請參閱Chris Hanson的上面的答案) – Drew

0

您需要提供VALUES左側的字段名稱,那麼您需要一個?對於每個值:

INSERT INTO some_table (some, columns) VALUES (?, ?) 

編輯

你不能在列列表中的佔位符。請參閱http://php.net/manual/en/mysqli.prepare.php

這些標記僅在SQL語句中的某些地方纔是合法的。例如,對於 示例,它們可以在INSERT語句 (用於指定行的列值)的VALUES()列表中,或與WHERE子句中的列 進行比較以指定比較值。

然而,他們不允許標識符(如表或列 名),在由一個 SELECT語句返回名稱的列,或指定一個二元運算的兩個操作數的選擇列表 這樣作爲=等號...

+0

啊,是的,就是這樣。所以,爲了關閉這個,你不能使用佔位符作爲列名? – hornswoggle