2015-01-14 7 views
0

Мой код здесь;Синтаксис SQL Код ошибки 1064

$m = 0.5; 

$this->db->query("update chatusers set money = money - ".$m." where user = '".$this->input->post('member')."'"); 

и я получаю эту ошибку;

Ошибка базы данных Происходило

Номер ошибки: 1064

У Вас есть ошибка в вашем SQL синтаксиса; проверьте руководство, которое соответствует версии сервера MySQL для правильного синтаксиса, чтобы использовать рядом «где пользователь =„“» в строке 1

обновление chatusers набор деньги = деньги - где пользователя = «»

Имя файла:/главная/modenatu/public_html/бета/модели/номер модели/mupdate.php

Line: 87

Я не мог найти, как это исправить. Заранее спасибо.

+2

Вы сделали минимальный по устранению неполадок? Как повторять запрос? –

+0

Вы отправляете поле под названием '' member''? Что такое '$ m'? –

+3

P.S. Этот код * широко открыт * для SQL-инъекции. –

ответ

2

Похоже, что $m оценивает пустую строку на основе сообщения об ошибке.

Похоже, что $this->input->post('member') также оценивает пустую строку.

update chatusers set money = money - where user = '' 
            ^   ^

Потому что если эти два оценивал на непустые строки (скажем, например, 'foo' и 'bar' соответственно), мы ожидали бы, что SQL будет так:

update chatusers set money = money - foo where user = 'bar' 
            ^^^    ^^^ 

К счастью , $m не оценил более гнусную строку. Такие, как money WHERE 1=1 --

Что произвело бы такое заявление:

update chatusers set money = money - money WHERE 1=1 -- foo where user = '' 

симптом проблемы является недействительным синтаксис. Реальные проблемы здесь: 1) потенциал для SQL Injection (мы не видим, какие значения содержат $ m), а 2) код вызывает недопустимый оператор SQL.

Ради всего хорошего и прекрасного в этом мире ... Я не могу подчеркнуть это достаточно ... использовать подготовленные заявления с связывания заполнителей.

Например:

$sql = 'UPDATE chatusers SET money = money - ? WHERE user = ?'; 
    $this->db->query($sql, array(0, 'me')); 
+0

Благодарю вас за помощь! – birlikbilisim

+0

@birlikbilisim: К сожалению, CodeIgniter не поддерживает подготовленные заявления. Но примером, который я дал, является шаблон, который вы хотите использовать с CodeIgniter ... потому что он дает вам статический оператор SQL, и вы поставляете значения (что очень похоже на то, что мы делаем с подготовленными операторами) ... разница здесь заключается в том, что в оболочках CodeIgniter ускользает от значений, которые вы предоставляете, делая ценности безопасными для включения в инструкцию SQL, которая закрывает некоторые уязвимости SQL Injection. (Итак, это не то же самое, что подготовленное заявление.) Мои извинения. – spencer7593

2

$m явно не имеет значения, которое вызывает у вашего запроса недопустимый синтаксис. Вы должны убедиться, что $m имеет действительное значение до, вы пытаетесь выполнить этот запрос. (FYI, $this->input->post('member') также не имеет значения, и использование этого значения неактифицирует, предоставляет вам SQL-инъекции).

+0

Нет, $ m имеет значение. $ m = 0,5; – birlikbilisim

+1

Он явно не имеет одного, когда он достигает вашего запроса. Вы уверены, что переменная находится в области видимости? –

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