Проблема с отображением данных

volt

Новичок
Здравствуйте! Подскажите, пожалуйста, в таком вопросе.

Вынимаю из БД данные и отображаю их в форме. При добавлении данных все происходит нормально, но при редактировании занесенных данных они просто не отображаются.

В таком виде

PHP:
<input type="text"name="name" value="<?php echo htmlspecialchars($row['name']); ?>">
данные можно только заносить, так как они потом при редактировании просто не отображаются.
Заметил что проблема с кодировкой. Потому что при такой записи:

PHP:
<input type="text"name="name" value="<?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'cp1251'); ?>">
все стало работать нормально.
Данные в БД - cp1251. В хедере документа кодировка указана.

Я так понимаю - не указана кодировка при соединении с БД. И наверное если правильно все прописать то не нужно будет менять все поля всех файлов php - все само должно будет заработать.

Но у меня не получается ее правильно прописать...
В файлах вывода информации прописывал:

PHP:
$row=$db->fetch($db->query("Select * from `$table_name` where id=$cat_id set character_set_results='cp1251'"));
- данные при htmlspecialchars() все равно не хотят отображаться.

Наверное нужно на уровне файлов подключения к БД прописывать - но тоже не получилось.

В файле соединения:

PHP:
<?php
class mysql
 {
	var $host = "xxx";
	var $user = "xxx";
	var $password = "xxx";
	var $database = "xxx";

     function pconnect($host, $user, $password)
      {
     	mysql_pconnect($host, $user, $password) or
	die("Can't connect to mySQL: ". mysql_error());
      }

 }

$db=new mysql;
$db->pconnect($db->host, $db->user, $db->password);
$db->select_db($db->database);
?>
пробовал прописать:
PHP:
mysql_query("SET NAMES 'cp1251'");
но либо не там вставляю, либо что-то в корне не понимаю. Можно конечно все прописывать в виде
PHP:
<input type="text"name="name" value="<?php echo htmlspecialchars($row['name'], ENT_QUOTES, 'cp1251'); ?>">
и при этом все будет работать, но понимаю, что это не совсем наверное правильно.

Спасибо за помощь.
 

Фанат

oncle terrible
Команда форума
как-то странно это все выглядит.
нельзя ли уменьшить количество посредников между базой данных и глазами пользователя?
сделать просто echo $row['name']; и посмотреть, что написано в исходном коде страницы?
 

volt

Новичок
как-то странно это все выглядит.
нельзя ли уменьшить количество посредников между базой данных и глазами пользователя?
сделать просто echo $row['name']; и посмотреть, что написано в исходном коде страницы?
Если просто - то добавить информацию получится без проблем. Но вывести будет сложно.
Если ввести в поле
тест"

то при редактировании информации - форма формироваться будет неправильно

<tr>
<td align=right>Розклад прийому:</td>
<td width="*"><input type="text" maxlength="30" name="receive" value="тест "" class="inputs"></td>
</tr>

- это вывод html.

При value="тест "" - вывод рушится. Без htmlspecialchars никуда

Я наверное неуказал - это скрипт внесения/редактирования данных в админке сайта
 

Фанат

oncle terrible
Команда форума
Как-то странно это все.
Ты точно не указываешь кодировку, когда у тебя выводится пустая строка?
у меня код
PHP:
<?
var_dump(htmlspecialchars("тест",ENT_QUOTES));
var_dump(htmlspecialchars("тест",ENT_QUOTES,"UTF-8"));
var_dump(htmlspecialchars("тест",ENT_QUOTES,"cp1251"));
выводит
PHP:
string(4) "тест"
string(0) ""
string(4) "тест"
какая версия PHP?
 

volt

Новичок
PHP Version 5.4.3

Получается это нормально, если прописывать в таком виде
var_dump(htmlspecialchars("тест",ENT_QUOTES,"cp1251"));
- так все работает. Я просто думал, что это плохой стиль.
 

Фанат

oncle terrible
Команда форума
судя по всему, в 5.4 дефолтной кодировкой для htmlspecialchars стала utf-8, и без явного указания кодировки функция делает из 1251 пустую строку (как и написано в документации).
Получается это нормально, если прописывать в таком виде
нет, это не нормально.
любой код, который повторяется много раз, надо сокращать.
в этом и состоит суть программирования.

Во-первых, как минимум, надо написать функцию
PHP:
function e($str) {
  global $config;
  return htmlspecialchars($str,ENT_QUOTES,$config['encoding']);
}
Во-вторых, по-хорошему, через неё надо прогонять все данные, поступающие в шаблон, автоматом.
в самом простом случае
PHP:
foreach($row as $k => $v) $row[$k] = e($v);
и потом выводить безо всяких функций.

Но в смысле явного указания кодировки при вызове htmlspecialchars - похоже, что с версии 5.4 это стало не "нормально", а больше того - обязательно
 

Beavis

Banned
Лучше просто всегда использователь utf-8 и не перекодировать всё вподряд туда сюда
 
Сверху