#1 2011.03.28 16:37

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

PDO

Да простят меня все те, кому тема не понравилась.

Поправьте если что, пожалуйста.
Буду очень благодарен.

Весь код будет занесён в этот пост!

Обозначения:
1? - первый вопрос, 2? - второй вопрос и т.д.

Соединение/Разъединение с базой.

Код:

1
span style="color: #0000BB"><?php//Соединение. //Gemorroj, Nu3oN - спс за поправки.$base = array('localhost', //Host'root', //User'', //Pass'tsb', //Base'utf8'); //Char if('5.3.6' > phpversion()) { $attr[PDO::MYSQL_ATTR_INIT_COMMAND] = 'SET NAMES `'.$base[4].'`;'; } $db = new PDO('mysql:host='.$base[0].';dbname='.$base[3].';charset='.$base[4].';', $base[1], $base[2], $attr);//Разъединение$db = null;?>

Запросы.

Код:

1
span style="color: #0000BB"><?php//Статичный: SELECT.$query = $db->query($QUERY_TEXT);//Статичный: INSERT, UPDATE, итд.$result = $db->exec($QUERY_TEXT); //в $result записывается количество затронутых строк.//Переменный: ОБЩИЙ, упорядоченный.//В примерах ниже экранировать символы (', ", и кажется \) не требуется.//Шаблон запроса.$query = $db->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?');//Запрос, где 1?=1-элемент массива, 2?=2-элемент массива.$query->execute(array($calories, $colour));//или//Шаблон запроса.$query = $db->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour');//Запрос, ну тут все наглядно.$query->execute(array(':calories' => $calories, ':colour' => $colour));//Переменный: ОБЩИЙ, с подготовкой данных.//Шаблон запроса.$query = $db->prepare('SELECT name, colour, calories FROM fruit WHERE calories < ? AND colour = ?');//Подготовка переменных, где 1=1? и 2=2?.$query->bindParam(1, $calories, PDO::PARAM_INT);$query->bindParam(2, $colour, PDO::PARAM_STR, 12);//Выполнить запрос.$query->execute();//или//Шаблон запроса.$query = $db->prepare('SELECT name, colour, calories FROM fruit WHERE calories < :calories AND colour = :colour');//Подготовка переменных.$query->bindParam(':calories', $calories, PDO::PARAM_INT);$query->bindParam(':colour', $colour, PDO::PARAM_STR, 12);//Запрос.$query->execute();?>

Откаты.

Код:

1
span style="color: #0000BB"><?php$db->beginTransaction(); //Транзакция, отключение авто-фиксации изменений.$query1 = $db->exec("DROP TABLE fruit");$query2 = $db->exec("UPDATE dessert SET name = 'hamburger'");$db->rollBack(); //Принц Персии (Все изменения отклонены до $db->beginTransaction();). //Транзакция снова на авто-фиксации изменений. //До тех пор, пока снова не укажите: $db->beginTransaction();//////Видимо это при сложных случаях...$db->beginTransaction(); //Транзакция, отключение авто-фиксации изменений.$query = $db->exec("DROP TABLE fruit"); //Натворили глупостей.$db->commit(); //Плюнули и пошли дальше. //Транзакция снова на авто-фиксации изменений.//Почему нельзя тогда просто так? Ведь автофиксация изменений.$query = $db->exec("DROP TABLE fruit"); //Натворили глупостей.?>

Организация вывода.

Код:

1
span style="color: #0000BB"><?php//Запрос #1.$q1 = $db->prepare('SELECT foo FROM bar');//Запрос #2 итд.$q2 = $db->prepare('SELECT foobaz FROM foobar');//Выполнить запрос #1.$q1->execute();//Извлечь запрос #1.$q1->fetch();//Завершить операции с запросом #1 (типа что-ли).$q1->closeCursor();//Выполнить запрос #2.$q2->execute();//... итд.///////Для разового вывода$query = $db->query("SELECT name FROM fruit WHERE calories = 100 LIMIT 1;");if($query->rowCount()) { foreach($query as $row) { print 'Name: '.$row['name'].'<br/>'; } } else { print 'Нет такой записи'; }$db = null;///////Для постраничного вывода$count = $db->query("SELECT COUNT(*) FROM fruit WHERE calories > 100;")->fetchColumn();if($count) { foreach($db->query("SELECT name FROM fruit WHERE calories > 100;") as $row) { print 'Name: '.$row['name'].'<br/>'; } } else { print 'Нет таких записей'; }$count = null;$db = null;?>

Отредактировано tipsun (2011.04.14 16:28)

Неактивен

#2 2011.03.28 18:37

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: PDO

beginTransaction - это транзакция.
bindParam. 1 - номер элемента, который биндим. PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT - параметры валидации
с COUNT вообще логика не правильная

Неактивен

#3 2011.03.28 20:08

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: PDO

Gemorroj написал:

с COUNT вообще логика не правильная

Это я на php.net взял smile
Точно, вроде понял. СПС!

Отредактировано tipsun (2011.03.29 17:39)

Неактивен

#4 2011.03.30 22:43

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: PDO

Что еще стоит рассмотреть?

Неактивен

#5 2011.03.30 22:50

Gemorroj
Administrator
Откуда: Белоруссия
Зарегистрирован: 2007.11.03
Сообщений: 6594
Карма: 107
Профиль Веб-сайт

Re: PDO

да для большинства случаев и этого выше крыши) а так - знания приходят с опытом. пиши скрипты, по ходу узнаешь чтонить новое.

Неактивен

#6 2011.03.30 22:56

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: PDO

СПС, что глянул smile
Я потом еще чуть добавлю про bindValue и другое

Неактивен

#7 2011.04.18 02:45

Nu3oN
Moderator
Откуда: БелгородЭ
Зарегистрирован: 2010.04.28
Сообщений: 805
Карма: 11
Профиль Веб-сайт

Re: PDO

На досуге поправил костыль http://nu3on.7je.ru/download/ForEnlargement_of_PDO.zip


Я буду лучше голоден, но между креслом и рулем и на дороге.

Неактивен

#8 2011.04.18 09:08

tipsun
Moderator
Зарегистрирован: 2009.10.14
Сообщений: 2277
Карма: 19
Профиль

Re: PDO

Из костыля, index.php -примеры. Кажется там забыли внести параметры. smile

Код:

1
span style="color: #0000BB"><?php// Не обрабатывать заявленные параметры.$array = array('value one', 'value two');DB :: $db -> sql("INSERT INTO `test` (`field_one`, `field_two`) VALUES (?, ?);", $array, DB :: PARAM_NOT_SQL);// Если не указать, то параметры так же не будут обрабатываться.$array = array('value one', 'value two');DB :: $db -> sql("INSERT INTO `test` (`field_one`, `field_two`) VALUES (?, ?);"); // ", $array ?// Обрабатывать заявленные параметры.$array = array(9999, 'value two');DB :: $db -> sql("INSERT INTO `test` (`field_one`, `field_two`) VALUES (?, ?);", DB :: PARAM_ALL_SQL); // ", $array, DB :: PARAM_ALL_SQL ?// Ообрабатывать заявленные параметры как числа.$array = array(228, 123);DB :: $db -> sql("INSERT INTO `test` (`field_one`, `field_two`) VALUES (?, ?);", DB :: PARAM_INT_SQL); // ", $array, DB :: PARAM_INT_SQL ?// Ообрабатывать заявленные параметры как строки.$array = array('value \'one\r\n /', 'value two');DB :: $db -> sql("INSERT INTO `test` (`field_one`, `field_two`) VALUES (?, ?);", DB :: PARAM_STR_SQL); // ", $array, DB :: PARAM_STR_SQL ??>

Отредактировано tipsun (2011.04.18 09:16)

Неактивен

Дополнительно

forum.wapinet.ru

PunBB Mod v0.6.2
0.011 s