2013-07-10 5 views
4

Я пытаюсь создать подготовленный оператор mysqli, где я импортирую таблицы из базы данных, подключенной к odbc, в базу данных mysql, я получаю эту ошибку с 106-столбцовым табличным запросом.Где ошибка запроса запроса mysqli?

У вас возникла ошибка в синтаксисе SQL; проверьте, что соответствует вашей версии сервера MySQL для правильного синтаксиса для использования рядом с '? (ID, column1, column2, колонка3, column4, 'в строке 1"

Когда эхо из запроса здесь ...

INSERT INTO? (ID, column1, column2, column3, column4, ... 106 полных столбцов ...) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?,?,?,? , & Alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha ;, & alpha ;, & alpha;, & & Alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha ;, & , & Alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha;, & alpha ;, & alpha ;, & alpha;, & ?,?,?,?,?,?,?,?,?,?,?,?,?,?, ?,?)

$sql = "SELECT * FROM $table WHERE $key = '$acct'"; 
$link = getODBCConnection(); 
$result = odbc_do($link, $sql); 
$data = array(); 
while ($row = odbc_fetch_array($result)) { 
     //store all query rows as array 
     array_push($data, $row); 
} 
//insert into mysql table of the same name 
//get column count from first row 
$columns = count($data[0]); 
$params = str_repeat(" ?,",$columns); 
$params = rtrim($params,','); 
$types = str_repeat("s",$columns+1); 
$fields = implode(", ", array_keys($data[0])); 
$sql = "INSERT INTO ? ($fields) VALUES ($params) ON DUPLICATE KEY UPDATE"; 
echo $sql."<br>"; 
$link = getSalesConnection(); 
$stmt = $link->prepare($sql); 
var_dump($link->error); 
foreach ($data as $row) { 
     $stmt->bind_param($types, $table, implode(", ",array_values($row))); 
     $stmt->execute(); 
} 

Я попытался это с помощью стандартных bind_param, а также с использованием метода call_user_func_array(). Я пробовал ссылаться на строки параметров и имена столбцов без эффекта. Если была ошибка с моими типами bind_param, я не должен был иметь ошибку в инструкции подготовки, должен ли я? Но есть некоторые проблемы с SQL, идущими к команде подготовки, которую я не могу определить. Пожалуйста помоги!

ответ

4

Параметры запроса могут использоваться вместо скалярных значений только. Вы не можете параметризовать имена таблиц, имена столбцов, выражения SQL, ключевые слова, списки значений и т.д.

  • НЕПРАВИЛЬНО: SELECT ?, b, c FROM t WHERE a = 1 ORDER BY b ASC
    Значение параметра будет буквенное значение, а не имя столбца.

  • WRONG: SELECT a, b, c FROM ? WHERE a = 1 ORDER BY b ASC
    Ошибка синтаксиса.

  • НЕПРАВИЛЬНО: SELECT a, b, c FROM t WHERE ? = 1 ORDER BY b ASC
    Значение параметра будет буквенное значение, а не имя столбца.

  • НЕПРАВИЛЬНО: SELECT a, b, c FROM t WHERE a IN (?) ORDER BY b ASC
    Значение параметра будет одно буквенное значение, а не список значений, даже если вы передаете строку значений, разделенных запятыми.

  • НЕПРАВИЛЬНО: SELECT a, b, c FROM t WHERE a = 1 ORDER BY ? ASC
    Значение параметра будет буквенное значение, а не имя столбца.

  • WRONG: SELECT a, b, c FROM t WHERE a = 1 ORDER BY b ?
    Ошибка синтаксиса.

В принципе, если вы могли бы написать строковый литерал, дату буквальной или числовой литерал вместо параметра запроса, оно должно быть в порядке. В противном случае вам необходимо интерполировать динамический контент в строку SQL до, которую вы подготовите().

2

Похоже, что функция bind_param() не заменяет самую первую '?' который определяет имя таблицы. Сначала попробуйте вручную поместить имя таблицы в подготовленную строку и использовать только?? маркеров, где он ожидает значений.

 Смежные вопросы

  • Нет связанных вопросов^_^