Кодировки при занесении данных в базу.

Duvanov

Новичок
Есть ли возможность привести пример настроек БД (кодировки).таблиц, полей, а то создаю базу, изначально в настройка UTF8. а в созданной базе какого черта уже другая.
Потому как уже так наэкспериментировался что голова кругом идет.ТО выводится черти что, то выводится норм. то заносишь черти что, то нет.
Куча статей с рекомендациями, делаешь, как не одно так другое.
короче говоря есть ли у кого то ссылка или пример:
-База данных с одной таблицей с 1 полем текстовым (и с ай ди если охота)
-2 файл php для вывода из базы записей и добавления на русском языке.
Всем спасибо.
 

zerkms

TDD infected
Команда форума
Duvanov
Вот вам и второй пример, когда ваша постановка вопроса "хромает". Ни одной детали в вопросе, которая позволила бы ответить. Но в этот раз нам всем уже лень расспрашивать вас и умолять озвучить таки конкретную проблему, так что мы банально забьём - может хотя бы это вам намекнёт, что вы что-то делаете не так.
 

sobachnik

Новичок
Создаёшь б.д.:
Код:
CREATE DATABASE `dbname` DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;
Создаёшь таблицу:
Код:
CREATE TABLE `tblname` (
	`field_1` INT,
	`field_2` VARCHAR
) DEFAULT CHARSET = utf8 COLLATE = utf8_general_ci;
Создаёшь PHP-скрипт и ставишь кодировку файла UTF-8 без BOM (например, в Notepad++) В скрипте в самом верху пишешь:
PHP:
header('Content-type: text/html; charset=UTF-8');
Дальше при подключении к б.д. пишешь что-то типа:

PHP:
$db = mysql_connect($host, $user, $pass);
mysql_query('SET NAMES utf8', $db);
mysql_select_db('dbname', $db);
В принципе, достаточно должно быть.
 

sobachnik

Новичок
zerkms
Ага, я знаю про эту функцию. Но не известно, какая версия у автора темы, по этому я так написал. У меня на локалхосте 5.2.1 стоит до сих пор...

Есть один старый сайт, который на хостинге - там вообще php 4 с чем-то :) Но работает и нормально.
 

sobachnik

Новичок
Недавно читал (не помню где, возможно даже здесь), что в новых версиях PHP обычные mysql_* функции будут обновлены - станут быстрее и будут использовать новые возможности MySQL 5. Не знаю, на сколько это так, посмотрим.

По поводу mysqli - ну, наверно, да. Я использовую его в последнее время, на нескольких уже сайтах, которые делал, но когда какие-то мелкие простые задачи обычно всё же (по привычке может) использую mysql_*
Параметризированные запросы - вообще как-то... Не знаю, не впечатлился :) Может это всё мои кривые руки, но у меня постоянно получалось, что кода больше и читать его менее удобно. Хотя если один и тот же запрос нужно отработать несколько раз с разными данными, то, наверно, лучше так, да. mysqli использую, но просто точно также, как mysql :) Без всяких его дополнительных возможностей.

Про PDO - даже как-то не разбирался, надо будет попробовать как-нибудь. А сейчас даже не знаю, что это и зачем...
 

sobachnik

Новичок
wadim, ясно, благодарю за ссылку. Сейчас пытался вспомнить, где же я видел инфу о том, что mysql_* функции будут обновлены в новых версиях PHP и не смог. Пытался найти - не нашёл. Не понимаю, почему я решил, что это так... Приснилось, чтоли? :)
 

sobachnik

Новичок
на PDO и mysqli пора было бы уже перейти
Сижу вот, читаю мануал по PDO, экспериментирую тут. Я на сколько понял, в нём нет такой штуки, как num_rows(). Мне в принципе не обязательно знать кол-во строк в результате запроса, но иногда желательно как-то отличать, есть ли там хотя бы одна - чтобы в зависимости от этого выводить либо что-то типа "тут пока пусто", либо, соответственно, нужные записи. Со стандартным mysql_* (ну и с mysqli) это просто и понятно,

PHP:
if(mysql_num_rows($res)) {
   // показываем записи
} else {
   // показываем "тут пусто"
}
А как это делается с использованием PDO? Мне кажется, далеко не всегда есть смысл сперва создавать какой-то массив данных со всеми строками результата (fetchAll()) - зачем лишний раз тратить память и выполнять лишние операции (сперва всё в массив, потом вывести массив, если он не пустой или сказать, что тут пусто)?

Можно, конечно, ещё что-то типа
PHP:
$res = $pdo->query($sql);
$row = $res->fetch();
if($row) {
   // показываем первую строку
   while($row = $res->fetch()) {
      // показываем остальные если есть
   }
} else {
   // тут пусто
}
Но что-то как-то это криво, по-моему, дважды писать код отображения записи из б.д...

В мануале описан вариант, как это делается - но там сперва запрос COUNT(*), потом уже запрос на получение данных. Тоже не нравится, зачем два запроса... :)

И второй вопрос - не нашёл в мануале (может плохо искал, конечно...) - можно ли как-то сделать, чтобы всегда использовался FETCH_ASSOC ? Т.е. там для каждого отдельного SELECT-запроса, получается, по-умолчанию FETCH_BOTH , если я предпочитаю FETCH_ASSOC - то мне нужно это явно указывать либо при каждом вызове метода fetch(), либо вызывать setFetchMode() , но всё равно это нужно делать для каждого запроса. Нельзя ли как-то один раз (ну там, при создании объекта PDO, например или ещё как-то) единожды указывать этот fetchMode для fetch() всех запросов?
 

zerkms

TDD infected
Команда форума
Нельзя ли как-то один раз (ну там, при создании объекта PDO, например или ещё как-то) единожды указывать этот fetchMode для fetch() всех запросов?
Можно отнаследоваться от класса PDOStatement и переопределить метод fetch() как хочется или после создания инстанса PDO:

PHP:
$pdo->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
 

wadim

Новичок
количество получается из объекта результата:
PHP:
$res->rowCount();
задать тип выводы результата:
PHP:
$res->setFetchMode(PDO::FETCH_ASSOC);
или
PHP:
$res->fetchAll(PDO::FETCH_ASSOC);
PHP:
$res->fetch(PDO::FETCH_ASSOC);
 

sobachnik

Новичок
rowCount() - это типа mysql_affected_rows() - т.е. он возвращает количество строк, затронутых последним INSERT / UPDATE / DELETE.
Я смотрел описание этого метода, там написано
If the last SQL statement executed by the associated PDOStatement was a SELECT statement, some databases may return the number of rows returned by that statement. However, this behaviour is not guaranteed for all databases and should not be relied on for portable applications.
Может для той б.д., которой ты обычно пользуешься он возвращает кол-во строк и для SELECT-запросов, но у меня (MySQL) возвращает ноль всегда (для DELETE и пр. возвращает правильное число).
 

zerkms

TDD infected
Команда форума
rowCount() - это типа mysql_affected_rows() - т.е. он возвращает количество строк, затронутых последним INSERT / UPDATE / DELETE.
Я смотрел описание этого метода, там написано

Может для той б.д., которой ты обычно пользуешься он возвращает кол-во строк и для SELECT-запросов, но у меня (MySQL) возвращает ноль всегда (для DELETE и пр. возвращает правильное число).
Судя по всему и вправду проблема есть: http://stackoverflow.com/questions/769767/pdos-rowcount-not-working-on-php-5-2-6 :-S Занимательно
 
Сверху