2014-12-29 3 views
-2

У меня есть массив строк в моей сессии, который я пытаюсь сохранить в базе данных. Но я получаю сообщение об ошибке:У вас есть ошибка в синтаксисе SQL: сохранение строк

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax

Мой код выглядит следующим образом:

$improve =$_SESSION['post']['improve']; 

if(is_array($improve)) 
    { 
    $sql = "INSERT INTO student (improve1) values ('%s')"; 
    $valuesArr = array(); 
    $i=0; 
    for ($i=1; $i <=$childtoen; $i++) 
     { 
     $improve_list=""; 
     if ($improve[$i][0]!="") 
       { 
        $improve= mysql_real_escape_string($improve[$i]); 
        $improve_list = implode(',', $improve); echo $improve_list; //echo is working Fine 
       } 

     $improve_list = mysql_real_escape_string($improve_list); 
     $valuesArr[] = "('$improve_list')"; 
     } 

$sql .= implode(',', $valuesArr); 
mysql_query($sql,$connection) or exit(mysql_error()); 
} 

Что может быть причиной, как я также избежать строки? Я даже попытался убежать от imptove_list, но не помог.

+0

Какое полное сообщение об ошибке? –

+0

Просто «эхо» результат запроса и посмотреть, что не так. Это очевидно! –

+0

сделайте 'echo $ sql' и покажите нам результат. И почему каждый новый пользователь использует функции 'mysql_ * '? Они ** устарели **, не используют их. Изучите mysqli или даже лучше PDO. 'mysql_ *' устарел. –

ответ

0

Я думаю, что вы получите сообщение об ошибке, поскольку $sql .= implode(',', $valuesArr); просто добавьте вмонтированный массив к вашей предопределенной строке, и поэтому SQL-Statement недействителен.

Редактировать: После прочтения вашего сообщения об ошибках.

Когда я правильно понимаю ваш сценарий, $valuesArr[] = "('$improve_list')"; слишком много. Конечным результатом этого будет ('ADHD,ASPERGER'). Я думаю, что это приведет к SQL-заявлению вроде INSERT INTO student (improve1) values ('('ADHD,ASPERGER')') И тогда у вас есть данная ошибка, так как ' сокращает ваш SQL.

Простой способ, если бы сменить базовый код на INSERT INTO student (improve1) values %s, если вы убедитесь, что результат в $valuesArr[] всегда как ('ADHD,ASPERGER').

Но я хотел бы предложить вам просто хранить реальные значения (СДВГ, Аспергера, NEXTVALUE, ANOTHERVALUE, ...) в массиве и построить SQL так:

$sql = sprintf($sql, implode(',', $valuesArr)); 

Это заменит заполнитель %s с строкой от implode. Затем вам следует сэкономить, поскольку вы избегаете (' и ') за каждое значение

+0

вы имеете в виду '$ sql. = implode ($ valuesArr);'? Если я сделаю эту ошибку, исчезнет, ​​но значение в databse будет '% s'. –

+0

Я обновил свой ответ после того, как вы отправили сообщение об ошибке. – bish

+0

Спасибо, @bish это сработало –

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