MySQL запрос не работает правильно изнутри приложения - PullRequest
0 голосов
/ 28 марта 2010

Я полностью в тупике. Вот мой код php (CodeIgniter):

function mod()
{
    $uid = $this->session->userdata('uid');
    $pid = $this->input->post('pid');
    if ($this->_verify($uid,$pid))
    {
        $name  = $this->input->post('name');
        $price = $this->input->post('price');
        $curr  = $this->input->post('curr');
        $url   = $this->input->post('url');

        $query = $this->db->query("UPDATE items SET
                        name=".$this->db->escape($name).",
                        price=".$this->db->escape($price).",
                        currency=".$this->db->escape($curr),",
                        url=".$this->db->escape($url)."
                        WHERE pid=".$this->db->escape($pid)." LIMIT 1");
    }
    header('location: '.$this->session->userdata('current'));

}

Цель этого кода - изменить свойства (имя, цена, валюта, URL) строки в таблице «items» (первичный ключ - pid). Однако, по какой-то причине, разрешив запуск этой функции один раз, можно изменить имя, цену, валюту и URL-адрес ВСЕХ записей в таблице, независимо от их pid и значения LIMIT 1, которое я добавил в конец запроса. Как будто последняя строка запроса полностью игнорируется.

Как будто это не было достаточно странно, я заменил "$query = $this->db->query(" на "echo", чтобы увидеть, как выполняется SQL-запрос, и он выдает запрос, очень похожий на то, что я ожидал:

UPDATE items 
   SET name = 'newname', 
       price = 'newprice', 
       currency = 'newcurrency', 
       url = 'newurl' 
 WHERE pid = '10' 
 LIMIT 1

Копирование-вставка этого в окно MySQL действует именно так, как я хочу: оно изменяет строку с выбранным pid.

Что здесь происходит ???

Ответы [ 2 ]

0 голосов
/ 28 марта 2010

Я знаю, что вы ответили на свой вопрос, но позвольте мне добавить это в кучу: вы не используете CodeIgniter AT ALL в запросе такого рода - что если бы вы использовали CI, как предполагалось, у вас не было бы эта опечатка. Ваш запрос должен выглядеть так (помимо прочего):

$query = $this->db->update('items', 
                           array('name' => $this->input->post('name'),
                                 'price' => $this->input->post('price'),
                                 'curr' => $this->input->post('curr')),
                           array('id' => $this->input->post('id')),
                           1);

Собирая строку запроса вручную, вы отменяете то, что CI делает для вас. Только когда вы используете какой-то сложный оператор JOIN, вы должны писать свой собственный SQL в CI, и даже тогда вы захотите использовать PHP-функцию sprintf, чтобы убедиться, что вы не вводите опечатки.

0 голосов
/ 28 марта 2010

Теперь я чувствую себя глупо: все, что нужно, это увидеть мой код другим шрифтом. Мой код имеет

currency=".$this->db->escape($curr),",

вместо

currency=".$this->db->escape($curr).",

Эхо заставило его работать просто отлично, потому что, очевидно, вы можете дать эхо более чем одной строке, разделенной запятой, и она объединит их

плачет Я потратил часы на это

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...