MySQLi подготовил заявления и заменил на - PullRequest
0 голосов
/ 24 декабря 2008

Мне нужно следующий код:

http://www.nomorepasting.com/getpaste.php?pasteid=22987

Если PHPSESSID еще нет в таблице, запрос REPLACE INTO работает просто отлично, однако, если существует PHPSESSID, вызов для выполнения завершается успешно, но для sqlstate задано значение HY000, что не очень полезно и $_mysqli_session_write->errno а также $_mysqli_session_write->error оба пусты, а столбец данных не обновляется.

Я вполне уверен, что проблема где-то в моем сценарии, так как ручное выполнение REPLACE INTO из mysql работает нормально, независимо от того, находится ли PHPSESSID в таблице.

Ответы [ 3 ]

1 голос
/ 11 января 2009

«REPLACE INTO» выполняет 2 запроса: сначала «DELETE», а затем «INSERT INTO». (Таким образом, новый auto_increment - «By Design»)

Я также использую «REPLACE INTO» для моих сеансов базы данных, но я использую MySQLi-> query () в сочетании с MySQLI-> real_escape_string () вместо MySQLi-> prepare ()

1 голос
/ 24 декабря 2008

Почему вы пытаетесь подготовиться в функции открытия сеанса? Я не верю, что функция записи вызывается более одного раза во время сеанса, поэтому подготовка ее в открытом режиме не слишком важна для вас, вы также можете сделать это при записи сеанса.

В любом случае, я считаю, что вам нужно несколько пробелов после имени таблицы и перед списком столбцов. Я думаю, что без пробелов mysql будет действовать так, как если бы вы пытались вызвать несуществующую функцию session ().

REPLACE INTO session (phpsessid, data) VALUES(?, ?)

MySQL не видит разницы между 'COUNT ()' и 'COUNT ()'

Интересно, что когда я запускаю приведенное ниже в CLI mysql, я получаю другой результат.

mysql> select count (*);
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '*)' at line 1
mysql> select count(*);
+----------+
| count(*) |
+----------+
|        1 | 
+----------+
1 row in set (0.00 sec)
0 голосов
/ 01 января 2009

Итак, как оказалось, есть другие проблемы с использованием REPLACE, о которых я не знал:

Ошибка № 10795: ЗАМЕНА перераспределяет новый AUTO_INCREMENT (что, согласно комментариям, на самом деле не ошибка, а «ожидаемое» поведение)

В результате мое поле id продолжает увеличиваться, поэтому лучшим решением будет использовать что-то вроде:

INSERT INTO session (phpsessid, data) ЗНАЧЕНИЯ ('{$ id}', '{$ data}') ON DUPLICATE KEY UPDATE data = '{$ data}'

Это также предотвращает нарушение любых ограничений внешнего ключа и может привести к проблемам с целостностью данных.

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