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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: addslashes

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: Как писать в базу спецсимволы
Wooorker
Отправлено: 20 Марта, 2015 - 07:45:39
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




mysql_real_escape_string

а по сути уже пора переходить на mysqli или pdo, с их подготавливаемыми запросами
 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 08:09:40
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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 "";
 
 Top
exlant
Отправлено: 20 Марта, 2015 - 08:16:23
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




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

(Отредактировано автором: 20 Марта, 2015 - 08:19:09)

 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 08:24:37
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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

(Отредактировано автором: 20 Марта, 2015 - 08:27:07)

 
 Top
exlant
Отправлено: 20 Марта, 2015 - 08:32:31
Post Id



Посетитель


Покинул форум
Сообщений всего: 425
Дата рег-ции: Февр. 2015  


Помог: 14 раз(а)




По существу вопроса: на предложенный вами вариант сервер сильно ругается
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.  

(Отредактировано автором: 20 Марта, 2015 - 08:35:09)

 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 09:11:03
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




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, но в данном случае вставляется/обновляется единичная запись, поэтом решил пойти прямым путём. Не думал, что здесь и проблема с экранированием решается.
 
 Top
zloy dyx
Отправлено: 20 Марта, 2015 - 09:43:39
Post Id



Гость


Покинул форум
Сообщений всего: 103
Дата рег-ции: Авг. 2014  
Откуда: Германия


Помог: 0 раз(а)

[+]


mysqli_real_escape_string
 
 Top
Sail
Отправлено: 20 Марта, 2015 - 10:00:43
Post Id



Участник


Покинул форум
Сообщений всего: 1131
Дата рег-ции: Февр. 2014  


Помог: 57 раз(а)




zloy dyx, зря Вы так...
Wooorker, на крайний случай есть ещё quote()
 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 12:16:55
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Я докучи ещё спрошу по этому же вопрос, только другая проблема.
После вышеприведённого кода для проверки ввёл код
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. Буду тестить конкретно по этой записи.

(Отредактировано автором: 20 Марта, 2015 - 19:57:31)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2015 - 12:24:36
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




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)

Вы смотрите не то место, запросы разные.


-----
PostgreSQL DBA
 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 20:01:05
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Мелкий пишет:
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)


Ошибся, немного не то скопировал. В своём предыдущем посте исправил.
 
 Top
Мелкий Супермодератор
Отправлено: 20 Марта, 2015 - 20:09:38
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Зачем делается ON DUPLICATE KEY UPDATE и почему его лучше не использовать я, конечно, знаю. Вот это нафига сделано:
Wooorker пишет:
id=LAST_INSERT_ID(id)


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


-----
PostgreSQL DBA
 
 Top
Wooorker
Отправлено: 20 Марта, 2015 - 21:01:24
Post Id



Гость


Покинул форум
Сообщений всего: 99
Дата рег-ции: Нояб. 2011  


Помог: 0 раз(а)




Мелкий пишет:
Зачем делается ON DUPLICATE KEY UPDATE и почему его лучше не использовать я, конечно, знаю. Вот это нафига сделано:
Wooorker пишет:
id=LAST_INSERT_ID(id)


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

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

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

(Отредактировано автором: 20 Марта, 2015 - 21:03:25)

 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Вопросы новичков »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB