Jump to content
  • 0

real_escape_string not work


Simon
 Share

Question

$result = $db->query( "INSERT INTO `comments` VALUES (NULL,'" . $db->real_escape_string( $this->datacomment[ 1 ] ) . "', '" . $db->real_escape_string( $this->datacomment[ 0 ] ) . "', 0, '" . $db->real_escape_string( $this->datacomment[ 2 ] ) . "', CURDATE(), '" . $db->real_escape_string( $this->datacomment[ 3 ] ) . "')" ) or die( $db->error );

Есть такой обычный инсерт в базу. При запросе данные добавляются но кавычки не экранируются в базе. При выводе этого инсерта сообщение о ошибке не выдается. Это так надо или чего-то не так делается :blink:

Link to comment
Share on other sites

7 answers to this question

Recommended Posts

  • 0

http://forum.htmlbook.ru/index.php?showtopic=28502

такой класс для подключения использую.

да и если бы функция не работала то не выдавало бы ошибку такого рода:

Fatal error: Call to a member function real_escape_string() on a non-object?

Edited by Simon
Link to comment
Share on other sites

  • 0

это вы сами класс писали? я бы в коде пару мест подкорректировал.

ошибку рода Call to a member function on a non-object выдаёт в случае если вызывается метод или объект для переменной, которая не принадлежит к классу.

  • Like 1
Link to comment
Share on other sites

  • 0
но кавычки не экранируются в базе

В базе и не должны. Экранирование нужно именно для строки запроса, чтобы данные не мешались с управляющими элементами. Идеально (местами аж слишком) тема разжевана здесь (на примере MySQL, но в других СУБД принцип тот же).

  • Like 1
Link to comment
Share on other sites

  • 0

это вы сами класс писали? я бы в коде пару мест подкорректировал.

ошибку рода Call to a member function on a non-object выдаёт в случае если вызывается метод или объект для переменной, которая не принадлежит к классу.

я + php.net. По поводу класса выслушаю любые предложения, это пойдет мне на пользу.

но кавычки не экранируются в базе

В базе и не должны. Экранирование нужно именно для строки запроса, чтобы данные не мешались с управляющими элементами. Идеально (местами аж слишком) тема разжевана здесь (на примере MySQL, но в других СУБД принцип тот же).

понял, спасибо

Edited by Simon
Link to comment
Share on other sites

  • 0

я + php.net. По поводу класса выслушаю любые предложения, это пойдет мне на пользу.

пересмотрел ещё раз ваш код, он там не весь похоже, короче я не понял как он работает, если честно. Хочу задать пару наводящих вопросов

1. MyClass что делает, какая его задача? Почему он наследник MYSQLConnect?

2. такая конструкция


private function dbdata() {
$dbhost = "x";
$dbuser = "x";
$dbpass = "x";
$dbtable = "x";
return $data = array( $dbhost, $dbuser, $dbpass, $dbtable );
}

не вижу необходимости в такой многословности (или многострочности).

если оставлять такое решение (метод, только возвращающий инициализированные в нём же переменные, что тоже считаю спорным решением) то уж проще написать:


private function dbdata() {
return $data = array('x', 'x', 'x', 'x');
}

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


Class MYSQLConnect {
private $dbhost = "x";
private $dbuser = "x";
private $dbpass = "x";
private $dbtable = "x";

function __constract()
{
// и так далее

3. к стыду своему, работаю по старинке с просто mysql, поэтому не в курсе всего функционала mysqli, но может стоит добавить в ваш класс функций которые будут предоставлять данные в удобном виде, заодно обрабатывая возможные ошибки.

Link to comment
Share on other sites

  • 0

пересмотрел ещё раз ваш код, он там не весь похоже, короче я не понял как он работает, если честно. Хочу задать пару наводящих вопросов

1. MyClass что делает, какая его задача? Почему он наследник MYSQLConnect?

2. такая конструкция


private function dbdata() {
$dbhost = "x";
$dbuser = "x";
$dbpass = "x";
$dbtable = "x";
return $data = array( $dbhost, $dbuser, $dbpass, $dbtable );
}

не вижу необходимости в такой многословности (или многострочности).

если оставлять такое решение (метод, только возвращающий инициализированные в нём же переменные, что тоже считаю спорным решением) то уж проще написать:


private function dbdata() {
return $data = array('x', 'x', 'x', 'x');
}

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


Class MYSQLConnect {
private $dbhost = "x";
private $dbuser = "x";
private $dbpass = "x";
private $dbtable = "x";

function __constract()
{
// и так далее

3. к стыду своему, работаю по старинке с просто mysql, поэтому не в курсе всего функционала mysqli, но может стоит добавить в ваш класс функций которые будут предоставлять данные в удобном виде, заодно обрабатывая возможные ошибки.

1. MyClass содержит ввод и вывод данных. К примеру, стоит задача сделать систему комментариев. В этом классе введенные сообщения из формы обрабатываются и вводятся в базу, так же и вывожу комментарии.

Для работы с базой, каждому методу надо подключать коннект к базе, тут я и решил создать отдельный класс и вызывать его с $db=parent::_construct();. На данный момент поместил этот класс в отдельный файл и где необходимо делаю инклуд.

2. У меня появились трудности с отдельный конфиг.файлом. Случай такой был когда файл который выводит те же комментарии вставлял инклудом в файл фулл.нюз то некоторые методы класса выводились в этом файле (нюз.фулл) , и тут надо было приписать один путь к кофиг файлу, а этому же методу для обработки других действий как бы приходилось писать другой путь..как-то так... :o .... иии я тут сильно запутался иии забил)) (н3 если ты поймешь)

Но сейчас я этот класс в отдельный файл закинул и вызываю его когда он необходим.

3. Посмотрим что можно сделать.

Спасибо.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy