Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
Доброго дня всем ) Уже 3ий день мучают несколько вопросов, в гугле лекарства нашел, но чую должно быть более оптимальное решение...
Решил перейти с MySQL на использование MySQLi и сразу же столкнулся с проблемой при написании своего первого класса с использованием MySQLi. Вот пример:
function addArticle($title,$content,$date,$author){
$this->mysqli->query("INSERT INTO articles(title, content, date, author) VALUES('$title','$content','$date','$author')")or die($this->mysqli->error);
}
function __destruct (){
$this->mysqli->close();
echo"Соединение с БД закрыто";
}
}
$obj=new baseCMS();
?>
А что если объектов будет больше? Каждый раз будет открываться и закрываться соединение... А нужно что бы было одно для всех, как например в MySQL создали 1 файл и инклюдим его повсюду где надо... Видел примеры в гугле с использованием сингл тона, но как то "грязно" выглядит на мой взгляд.
Получается нужно создать отдельный класс для соединения с БД? Если да, то какой от него толк? Выходит что опять же лишняя писанина... Проще в каждом методе просто открыть и закрыть соединение... Не могу разобраться, помогите пожалуйста
И ещё заметил что начало глючить $mysqli->real_escape_string. При выводе с echo спецсимволы экранируется, а вот в БД опять же уходит без экранирования... Читал что проблема из за кодировки, пробовал с разными, результат один и тот же...
AlexAnder
Отправлено: 11 Июня, 2013 - 13:04:52
Частый посетитель
Покинул форум
Сообщений всего: 915
Дата рег-ции: Авг. 2012 Откуда: Россия
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
как вариант public static $mysqli;
хотя в ряде случаев singleton предпочтительнее для начала можно и просто статической переменной пользоваться
+ы статической переменной(она же и в singleton используется) в том что область видимости - везде (Добавление)
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
Мне проще будет в каждом методе открыть/закрыть соединение, стыдно признать, но в упор не понимаю что к чему...
LIME пишет:
set_charset('utf8');
Спасибо учту, а как быть с экранированием спец. символов? В конце первого поста описал проблему, как можно ее вылечить? Если использую mysql_real_escape_string или $mysqli->real_escape_string() и вывожу результат при помощи echo, то экранируется нормально, но в БД данные добавляются уже без экранирования...
DeepVarvar
Отправлено: 11 Июня, 2013 - 13:37:36
Активный участник
Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008 Откуда: Альфа Центавра
Помог: 353 раз(а)
teddy пишет:
проще будет в каждом методе открыть/закрыть соединение
Бред.
teddy пишет:
но в БД данные добавляются уже без экранирования..
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
DeepVarvar пишет:
Бред.
Знаю, что бред ) затем и обратился на форум )) не знаю, бывает у меня такое, чего то не понимаю в упор, но спустя некоторое время начинаю смеяться над самим собой )) ну это тогда когда уже врубаюсь в тему ))
DeepVarvar пишет:
Так и должно быть.
Странно, я почему то думал в БД должно добавляться уже экранированные данные, иначе какой толк от функции? Если мне не изменяет память, то видел даже своими глазами в одном из обучающих видеоуроков... месяца 2-3 назад было конечно, поэтому могу ошибаться...
Ах вот оно что, точно, видел такое )) Но почему то в голове крутилась мысль "mysqli же более совершеннее чем mysql", значит там все должно быть проще! ) Оно и сбивало меня с толку... я думал что это бред и есть более простое решение спасибо за помощь! )
$query="SELECT * FROM tbl WHERE login='{$_GET['login']}' AND psw='{$_GET['psw']}'";
что будет если ввести в поле логина и пароля например
' OR 1=1 AND id<>'
teddy
Отправлено: 11 Июня, 2013 - 13:57:24
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME
А-а, теперь понятно.. тоесть экранирование действует в момент выполнения запроса, если я правильно понял, таким образом "внедренный" скрипт остается в ауте в момент запроса и не срабатывает, а то что он добавится в БД - это не страшно...
И если я все правильно понял, то выходит убил сразу двух зайцев. Недавно задался вопросом: Если все в БД добавляется со слешами, то как на этом форуме люди спокойно публикуют различные скрипты и БД ни чуть не страдает от этого и визуально все норм выглядит без всяких слешей...
ну чтож, закрываем тему наверное )) Спасибо ещё раз, теперь могу кодить дальше.. а то тупил почти 3 дня )
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
тебе надо уяснить одно простую весч
сервер бд работает отдельно
и строка запроса передается в него
именно строка
которую формирует пых
и экранированные символы бд воспринимает как часть значения
esterio
Отправлено: 11 Июня, 2013 - 14:10:31
Активный участник
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
teddy пишет:
Странно, я почему то думал в БД должно добавляться уже экранированные данные, иначе какой толк от функции? Если мне не изменяет память, то видел даже своими глазами в одном из обучающих видеоуроков... месяца 2-3 назад было конечно, поэтому могу ошибаться...
В виду последним массовым напливом вопросов про mysql_real_escape_string
небольшое отступление. есть запрос
SELECT*FROM users WHERE user='teddy'; DROPTABLE users; --'
Что произедет: будет возвращен пользователь с ником teddy и удалена таблица users
Теперь воспользуемся екранацией данных
$query = "SELECT * FROM users WHERE user='".mysql_real_escape_string($_POST['user'])."'";[/PHP]
в итоге получим запрос:
SELECT*FROM users WHERE user='teddy\'; DROP TABLE users; --'
Тоесть таблица не будет удалена
LIME
Отправлено: 11 Июня, 2013 - 14:29:43
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Помог: 322 раз(а)
вообще-то она итак не будет удалена))
пых в общем случае не позволяет выполнять несколько запросов))
teddy
Отправлено: 11 Июня, 2013 - 14:48:26
Участник
Покинул форум
Сообщений всего: 1462
Дата рег-ции: Апр. 2013
Помог: 91 раз(а)
LIME пишет:
тебе надо уяснить одно простую весч
сервер бд работает отдельно
и строка запроса передается в него
именно строка
которую формирует пых
и экранированные символы бд воспринимает как часть значения
ага, получается я просто не совсем правильно представлял себе как оно работает )
esterio
Спасибо за подробное описание ) заметил разницу в подсветке SQL запроса, в последнем случае запрос на "удаление" не подсвечивается как "удаляющий"... надеюсь правильно объяснил то, что хотел сказать )) Почти такие же примеры увидел в одной статье про sql иньекции на хабре )
Покинул форум
Сообщений всего: 5025
Дата рег-ции: Нояб. 2012 Откуда: Украина, Львов
Помог: 127 раз(а)
teddy LIME прав. мушу извинится за дизинформацию. только что протестил. и правда таблица не удалилась. но суть одинакова. думал пример с удалением таблиц будет виглядеть более угрожающе
LIME
Отправлено: 11 Июня, 2013 - 15:02:57
Активный участник
Покинул форум
Сообщений всего: 10732
Дата рег-ции: Нояб. 2010
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.