PHP, mysql_query просто НЕ работает - PullRequest
1 голос
/ 01 февраля 2012

Я готов вырвать свои волосы ...

Это прекрасно работает:

$link = mysql_connect('localhost', 'prototype_wp_usr', 'password') or die("Error: " . mysql_error());
mysql_select_db('prototype_wp');
$query = "INSERT INTO wp_zsession_capture
        (id, session_id, user_login, first_name, last_name, user_email, phone_number, last_conviction)
        VALUES (
            'NULL', 
            '". session_id() ."',
            '". $_POST['user_login'] ."',
            '". $_POST['first_name'] ."',
            '". $_POST['last_name'] ."',
            '". $_POST['user_email'] ."',
            '". $_POST['phone_number'] ."',
            '". $_POST['last_conviction'] ."'
        )";

mysql_query($query) or die ('Error updating database: ' . mysql_error());
mysql_close($link);

Это делает НЕ работа:

$link = mysql_connect('localhost', 'prototype_wp_usr', 'password') or die("Error: " . mysql_error());
mysql_select_db('prototype_wp');
$query = "UPDATE wp_zsession_capture SET removed = 1 WHERE session_id = '$sessionid'";

mysql_query($query) or die ('Error updating database: ' . mysql_error());
mysql_close($link);

Эти два фрагмента кода находятся внутри формы ... если в форме есть ошибки, запускается FIRST sql-запрос, чтобы сохранить все, что находится в сеансе в этой точке.Если ошибок нет и после выполнения каких-либо других действий выполняется ВТОРОЙ sql-запрос, чтобы ОБНОВИТЬ состояние «удален» в этих ранее сохраненных записях.

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

К вашему сведению: $ sessionid = session_id ();

- ОБНОВЛЕНИЕ --

Я действительно ценю озабоченность каждого, но позвольте мне остановиться на некоторых вещах:

  1. Да, в моей таблице есть столбец с именем «удален» ... Вы серьезно?: P
  2. Я, конечно, использую session_start ();
  3. Да, я проверяю $ sessionid, чтобы убедиться, что он вызывается.Он постоянно отображается на странице и также входит в любые операторы die, которые я выполняю.
  4. FIRST-запрос отвечает за создание строк, которые SECOND-запрос должен обновлять ... поэтому данныеесть.
  5. mysql_error() ничего не дает ... ошибки просто нет.

Опять же, я ценю ваше беспокойство, но пока все предложения были опробованы и опробованыснова.

enter image description here

Ответы [ 5 ]

9 голосов
/ 01 февраля 2012

Используйте mysql_error() для получения сообщения об ошибке из базы данных, например:

mysql_query($query) or die ('Error updating database: '.mysql_error());

Ошибка может быть одной из многих, например, может быть, у пользователя нет разрешения DELETE. Если вы не используете mysql_error(), вы не сможете узнать, что произошло.

Редактировать Данные в столбце session_id выглядят подозрительно короткими. Проверьте длину строк, возвращаемых session_id, и проверьте длину столбца в базе данных. Вставка данных, которые слишком длинны для столбца, не является ошибкой, но обрезает данные.

3 голосов
/ 01 февраля 2012

Вы пробовали проверить ...

  1. Что означает $sessionid при запуске сценария
  2. Какую ошибку возвращает mysql?

Вы можете сделать последнее, изменив свой die() на ...

mysql_query($query) or die (mysql_error());
0 голосов
/ 20 декабря 2016

Снимите флажок «Автоинкремент» в структуре базы данных, затем снова установите его, чтобы сохранить структуру автоинкремента, и ваша проблема будет решена. Я получил такую ​​ошибку при выполнении

mysql_query ($ query) или die (mysql_error ());

Ошибка была

Обновление базы данных не удалось: автоматическое создание не удалось обновить Engine.

Похоже, эта ошибка произошла, я не скопировал

0 голосов
/ 31 июля 2012

Одна из возможных причин, по которой mysql_error () возвращает пустое значение, заключается в том, что одновременно открыто более одного соединения.У меня недавно была эта проблема при переносе скриптов на более новый сервер / версию PHP.Попробуйте указать дескриптор соединения в своем вызове следующим образом: mysql_error ($ link)

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

И,хотя вы заявили, что вас не беспокоят инъекционные атаки, вы должны ВСЕГДА УБРАТЬ ВСЕ ДАННЫЕ, поступающие из пользовательского / сомнительного источника.По крайней мере используйте mysql_real_escape_string () вокруг КАЖДОЙ переменной $ _GET, $ _POST, $ _COOKIE, $ _REQUEST и $ _SERVER, которую вы поместили в базу данных.Я отсылаю вас к истории маленьких столов Бобби ...

This is what happens if you don't escape user input.

(http://xkcd.com/327/)

0 голосов
/ 01 февраля 2012

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

Возможно, вы также захотите позвонить session_start(), прежде чем связываться с session_id();

...