Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: addslashes
Форумы портала PHP.SU » » Вопросы новичков » addslashes

Страниц (1): [1]
 

1. Wooorker - 20 Марта, 2015 - 07:45:39 - перейти к сообщению
Нужно писать в базу некий текст. В котором иногда встречается апостроф '
mysql, естественно, отказывается писать его в базу, при этом двойные кавычки и проч пишутся без проблем.
Если я пользуюсь addslashes(), то всё пишется в базу, зато материал, который берётся из этой базы для отображения на сайте отображается не в виде ", а в виде /", т. е. с ненужными мне слэшами.
Подскажите, как можно решить эту проблему на стадии записи в БД, т. к. вывод на экран из БД я изменить не могу.
2. exlant - 20 Марта, 2015 - 07:58:53 - перейти к сообщению
mysql_real_escape_string

а по сути уже пора переходить на mysqli или pdo, с их подготавливаемыми запросами
3. Wooorker - 20 Марта, 2015 - 08:09:40 - перейти к сообщению
exlant пишет:
mysql_real_escape_string

а по сути уже пора переходить на mysqli или pdo, с их подготавливаемыми запросами


так я pdo только и пользуюсь
PHP:
скопировать код в буфер обмена
  1. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  2.                VALUES ('$kod', '$name')
  3.                ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = '$kod', name = '$name'";
  4.                 $stmt=$this->db->prepare($sql);
  5.                 if(!$stmt->execute()) echo "";
4. exlant - 20 Марта, 2015 - 08:16:23 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES ('$kod', '$name')
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  

почему не так тогда?

http://php.net/manual/ru/pdo.prepare.php
5. Wooorker - 20 Марта, 2015 - 08:24:37 - перейти к сообщению
exlant пишет:
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES ('$kod', '$name')
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  

почему не так тогда?

http://php.net/manual/ru/pdo.prepare.php


А разница? Работает одинаково.
По существу вопроса: на предложенный вами вариант сервер сильно ругается
CODE (html):
скопировать код в буфер обмена
  1. mysql_real_escape_string(): Access denied for user 'username' (using password: NO) in /var/www/script.inc.php on line N
  2. Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/script.inc.php on line N
6. exlant - 20 Марта, 2015 - 08:32:31 - перейти к сообщению
По существу вопроса: на предложенный вами вариант сервер сильно ругается
CODE (html):
скопировать код в буфер обмена
  1. mysql_real_escape_string(): Access denied for user 'username' (using password: NO) in /var/www/script.inc.php on line N
  2. Warning: mysql_real_escape_string(): A link to the server could not be established in /var/www/script.parse.inc.php on line N

по вашему вопросу, я предположил, что используется библиотека mysql, поэтому предложил mysql_real_escape_string, на pdo эта функция естественно работать не будет!

Цитата:
А разница? Работает одинаково.


разница существенная! вставляемые таким образом данные, экранируются самими pdo

Цитата:
Вызов PDO::prepare() и PDOStatement::execute() для запросов, которые будут запускаться многократно с различными параметрами, повышает производительность приложения, так как позволяет драйверу кэшировать на клиенте и/или сервере план выполнения запроса и метаданные, а также помогает избежать SQL иньекций, так как нет необходимости экранировать передаваемые параметры.

я рекомендую все же перечитать, что здесь написано http://php.net/manual/ru/pdo.prepare.php

а вот здесь ошибся не много, первые переменные не заметил!
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES (:kod, :name) // поправил
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  
7. Wooorker - 20 Марта, 2015 - 09:11:03 - перейти к сообщению
exlant пишет:

разница существенная! вставляемые таким образом данные, экранируются самими pdo

Цитата:
Вызов PDO::prepare() и PDOStatement::execute() для запросов, которые будут запускаться многократно с различными параметрами, повышает производительность приложения, так как позволяет драйверу кэшировать на клиенте и/или сервере план выполнения запроса и метаданные, а также помогает избежать SQL иньекций, так как нет необходимости экранировать передаваемые параметры.

я рекомендую все же перечитать, что здесь написано http://php.net/manual/ru/pdo.prepare.php

а вот здесь ошибся не много, первые переменные не заметил!
PHP:
скопировать код в буфер обмена
  1.  
  2. $sql="INSERT INTO `".$this->_goods."` (kod, name)
  3.               VALUES (:kod, :name) // поправил
  4.               ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  5.                 $stmt=$this->db->prepare($sql);
  6.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name))) echo "";
  7.  


Про ошибку-то я заметил, это не вопрос.
Да, действительно, данный способ помог решить проблему.
Обычно я bindю данные для excute, но в данном случае вставляется/обновляется единичная запись, поэтом решил пойти прямым путём. Не думал, что здесь и проблема с экранированием решается.
8. zloy dyx - 20 Марта, 2015 - 09:43:39 - перейти к сообщению
mysqli_real_escape_string
9. Sail - 20 Марта, 2015 - 10:00:43 - перейти к сообщению
zloy dyx, зря Вы так...
Wooorker, на крайний случай есть ещё quote()
10. Wooorker - 20 Марта, 2015 - 12:16:55 - перейти к сообщению
Я докучи ещё спрошу по этому же вопрос, только другая проблема.
После вышеприведённого кода для проверки ввёл код
PHP:
скопировать код в буфер обмена
  1. if ($id == 0) echo 'У id = 0 !!!<br>';

И вот прогнал все записи и только у одной вышла такая ошибка:
CODE (html):
скопировать код в буфер обмена
  1. Не удалось добавить/обновить запись с помощью запроса:
  2. INSERT INTO `goods` (kod, name) VALUES (:kod, :name) ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name
  3. У id = 0 !!!


id я определяю следующим образом (ещё раз весь код)

PHP:
скопировать код в буфер обмена
  1.                 $sql="INSERT INTO `".$this->_goods."` (kod, name)
  2.                VALUES (:kod, :name)
  3.                ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name";
  4.                 $stmt=$this->db->prepare($sql);
  5.                 if(!$stmt->execute(array(':kod' => $kod, ':name' => $name ))) echo 'Не удалось добавить/обновить запись с помощью запроса: <br>'.$sql.'<br>';
  6.                 $id = $this->db->lastInsertId();
  7.                 $stmt->closeCursor();
  8.                 if ($id == 0) echo 'У  id = 0 !!!<br>';

Есть какие-нибудь идеи?

P.S. Хотя вряд ли тут что сделаешь не зная значений kod & name. Буду тестить конкретно по этой записи.
11. Мелкий - 20 Марта, 2015 - 12:24:36 - перейти к сообщению
Wooorker пишет:
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name

Смотрю вот на это и не понимаю - нафига это сделано?

Wooorker пишет:
(ещё раз весь код)

В коде:
Wooorker пишет:
INSERT INTO `".$this->_goods."` (kod, artikul, name, price, razdel, kod_site, image_url, new, upak, size)                VALUES (:kod, :name)

В ошибке:
Wooorker пишет:
INSERT INTO `goods` (kod, name) VALUES (:kod, :name)

Вы смотрите не то место, запросы разные.
12. Wooorker - 20 Марта, 2015 - 20:01:05 - перейти к сообщению
Мелкий пишет:
Wooorker пишет:
ON DUPLICATE KEY UPDATE id=LAST_INSERT_ID(id), kod = :kod, name = :name

Смотрю вот на это и не понимаю - нафига это сделано?

Не могу поверить. Судя по вашему рейтингу вы не можете не знать зачем используется "ON DUPLICATE KEY UPDATE"
Мелкий пишет:

В коде:
Wooorker пишет:
INSERT INTO `".$this->_goods."` (kod, artikul, name, price, razdel, kod_site, image_url, new, upak, size)                VALUES (:kod, :name)


Ошибся, немного не то скопировал. В своём предыдущем посте исправил.
13. Мелкий - 20 Марта, 2015 - 20:09:38 - перейти к сообщению
Зачем делается ON DUPLICATE KEY UPDATE и почему его лучше не использовать я, конечно, знаю. Вот это нафига сделано:
Wooorker пишет:
id=LAST_INSERT_ID(id)


Раз execute дал false, то надо смотреть текст ошибки. И не понятно, нафига вы штатные исключения PDO отключили.
14. Wooorker - 20 Марта, 2015 - 21:01:24 - перейти к сообщению
Мелкий пишет:
Зачем делается ON DUPLICATE KEY UPDATE и почему его лучше не использовать я, конечно, знаю. Вот это нафига сделано:
Wooorker пишет:
id=LAST_INSERT_ID(id)


Когда на выходе нужно знать id обновлённой записи, то без id=LAST_INSERT_ID(id) этого никак не сделаешь.
Мелкий пишет:

Раз execute дал false, то надо смотреть текст ошибки. И не понятно, нафига вы штатные исключения PDO отключили.

Штатные исключения не отключал. Видимо в настройках сервера/php были по-умолчанию отключены. В этих настройках я не силён. Сервер debian , php 5.2

 

Powered by ExBB FM 1.0 RC1