Задавайте вопросы, мы ответим
Вы не зашли.
Здравствуйте.
Если исполняю к примеру такой запрос чеhез PhpMyAdmin
INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (unix_timestamp(), 1, 0, 3, 0, 0, 0, 0, '??????????????????', '', -1, 1, 3)
то в базе все появляется и нормально выводится. Но через php скрипт любые сообщения содержащие знак вопроса, восклицательный, &, обрываются при их появлении, то есть появляется вот такое сообщение об ошибке в логах:
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
INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (unix_timestamp(), 1, 0, 3, 0, 0, 0, 0, '
Array
(
[0] => Array
(
[file] => /db.inc.php
[line] => 232
[function] => db_exec
[args] => Array
(
[0] => INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (unix_timestamp(), 1, 0, 3, 0, 0, 0, 0, '??????????????????', '', -1, 1, 3)
[1] => Array
(
)
[2] => chat
)
)
[1] => Array
(
[file] => /c.php
[line] => 440
[function] => db_insert
[args] => Array
(
[0] => INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (unix_timestamp(), 1, 0, 3, 0, 0, 0, 0, '??????????????????', '', -1, 1, 3)
[1] => Array
(
)
[2] => chat
)
)
[2] => Array
(
[file] => /c.php
[line] => 333
[function] => chat_msg_send2
[args] => Array
(
[0] => Array
(
[message] => ??????????????????
[user_id] => 44617
[area_id] => 3
[clan_id] => 0
[x] => -1
[y] => 1
[b5] => 12
[personage] => 3
[bgroup] => 0
)
)
)
)
php код:
$query = 'INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (';
$query .= 'unix_timestamp(), ';
$query .= intval($params['user_id']).', ';
$query .= intval($params['chat_id']).', ';
$query .= intval($params['area_id']).', ';
$query .= intval($params['clan_id']).', ';
$query .= intval($params['system']).', ';
$query .= intval($params['to']).', ';
$query .= intval($params['private']).', ';
$query .= "'".mysql_real_escape_string($message)."', ";
$query .= "'".mysql_real_escape_string($message2)."', ";
$query .= intval($params['x']).', ';
$query .= intval($params['y']).', ';
$query .= intval($params['personage']).')';
$id = db_insert($query, array(), 'chat');
кодировка базы UTF-8.
Что можете посоветовать для решения этого вопроса?
Отредактированно Leksey2 (11.05.2010 02:35:06)
Неактивен
Посоветовать можно не использовать db_insert (конкретно — он у Вас
почему-то трактует апостроф как конец строки).
Неактивен
Я наверно не так объяснил. Если в запросе нет знаков вопроса, восклицательного, а только буквы, то все заносится в базу. Если в предложении встречаются ! или ?, запрос обрывается сразу перед ними, то есть получается что-то типа такого
INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (unix_timestamp(), 1, 0, 3, 0, 0, 0, 0, 'слово_перед_знаком_вопроса
Так вот я думаю, может эти знаки можно как-то перекодировать, что бы они не в прямом виде ложились в базу, а в измененном, и при выводе выводились как нужно?
Неактивен
Ааа, он реагирует не на апостроф, а на вопросительный знак Тогда он по крайней
мере не выглядит испорченным
Впрочем, решение то же — или использовать db_insert по назначению, или не исполь-
зовать его вовсе. Смотрите, что происходит. Когда db_insert видит строку вида
INSERT INTO tablename VALUES (?),
он подставляет вместо ? значение второго аргумента. У Вас вторым аргументом явля-
ется пустой массив. Соответственно, нужно или переделать запрос через нормальные
placeholderы (так, как он ожидает), или не использовать db_insert.
Неактивен
paulus написал:
нужно или переделать запрос через нормальные
placeholderы (так, как он ожидает), или не использовать db_insert.
Не могли бы по подробнее? а то я а так сказать начинающий
Неактивен
проблема решилась экранированием этих знаков
Неактивен
В Вашем случае правильнее было бы делать как-то так:
db_insert ('INSERT INTO chat (created, user_id, chat_id, area_id, clan_id, `system`, `to`, private, message, message2, x, y, personage) VALUES (NOW(),?,…)', array(intval($params['user_id']), …);
Неактивен