Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Передача русскоязычных данных через форму в бд знаками вопроса
 
 автор: lightning.say   (10.11.2010 в 10:12)   письмо автору
 
 

Допустим есть код системы регистрации:

<table>
<form method=post>
<tr><td>Имя:</td><td><input type=text name=name></td></tr>
<tr><td>Пароль:</td><td><input type=password name=pass></td></tr>
<tr><td>Пароль:</td><td><input type=password name=pass_again></td></tr>
<tr><td>e-mail:</td><td><input type=text name=email></td></tr>
<tr><td>URL:</td><td><input type=text name=url></td></tr>
<tr><td></td><td><input type=submit value='Зарегистрировать'></td></tr>
</form>
</table>
<?php
  $_POST
['name'] = trim($_POST['name']);
  
$_POST['pass'] = trim($_POST['pass']);
  
$_POST['pass_again'] = trim($_POST['pass_again']);
  if(empty(
$_POST['name'])) exit();
  if(empty(
$_POST['name'])) exit('Поле "Имя" не заполнено');
  if(empty(
$_POST['pass'])) exit('Одно из полей "Пароль" не заполнено');
  if(empty(
$_POST['pass_again'])) exit('Одно из полей "Пароль"
                                        не заполнено'
);
  if(
$_POST['pass'] != $_POST['pass_again']) exit('Пароли не совпадают');
  if(!empty(
$_POST['email']))
  {
    if(!
preg_match("|^[-0-9a-z_]+@[-0-9a-z_]+\.[a-z]{2,6}$|i",
                   
$_POST['email']))
    {
      exit(
'Поле "E-mail" должно соответствовать формату
            somebody@somewhere.ru'
);
    }
  }
  if (!
get_magic_quotes_gpc())
  {
    
$_POST['name']  = mysql_escape_string($_POST['name']);
    
$_POST['pass']  = mysql_escape_string($_POST['pass']);
    
$_POST['email'] = mysql_escape_string($_POST['email']);
    
$_POST['url']  = mysql_escape_string($_POST['url']);
  }
  require_once(
"config.php");
  
$query "SELECT COUNT(*) FROM userlist WHERE name = '$_POST[name]'";
  
$usr mysql_query($query);
  if(!
$usr) exit("Ошибка - ".mysql_error());
  
$total mysql_result($usr0);
  if(
$total 0)
  {
    exit(
"Данное имя уже зарегистрировано, пожалуйста, выберите другое");
  }
  
$query "INSERT INTO userlist
            VALUES(NULL,
                   '
$_POST[name]',
                   '
$_POST[pass]',
                   '
$_POST[email]',
                   '
$_POST[url]')";
  if(
mysql_query($query))
  {
    echo 
"<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=
$_SERVER[PHP_SELF]'>
          </HEAD></HTML>"
;
  } else exit(
"Ошибка при добавлении данных - ".mysql_error());
?>


файл config.php

<?php
 $dblocation 
"localhost";
 
$dbname "mybase";
  
$dbuser "root";
  
$dbpasswd "mypswd";
 
$dbcnx = @mysql_connect($dblocation$dbuser$dbpasswd);
mysql_query("SET character_set_client='cp1251'");
mysql_query("SET character_set_results='cp1251'");
mysql_query("SET character_collation_connection='cp1251_general_ci'");

  
  if (!
$dbcnx)
  {
    exit (
"<P>В настоящий момент сервер базы данных не доступен, поэтому
              корректное отображение страницы невозможно.</P>" 
);
  }
  if (!@
mysql_select_db($dbname$dbcnx))
  {
    exit( 
"<P>В настоящий момент база данных не доступна, поэтому
              корректное отображение страницы невозможно.</P>" 
);
  }
?>

При отправке данных через форму на русском языке, к примеру имени, в базе данных
оно сохраняется знаками вопроса, как быть? на английском все нормально...

  Ответить  
 
 автор: Trianon   (10.11.2010 в 10:39)   письмо автору
 
   для: lightning.say   (10.11.2010 в 10:12)
 

SHOW CREATE DATABASE mybase;

SHOW CREATE TABLE userlist; 


что показывает?


За подобную фильтрацию е-мэйл следует расстреливать.
За хранение пароля - тоже.

И это... заголовок бы поглядели. как отправляется в php... а то мета эта ... позорище ведь...

  Ответить  
 
 автор: lightning.say   (10.11.2010 в 11:59)   письмо автору
 
   для: Trianon   (10.11.2010 в 10:39)
 

1./* 40100 DEFAULT CHARACTER SET latin1 */

2.
userlist CREATE TABLE `userlist` (
`id_user` int(11) NOT NULL auto_increment,
`name` tinytext character set cp1251 NOT NULL,
`pass` tinytext character set cp1251 NOT NULL,
`email` tinytext character set cp1251 NOT NULL,
`url` tinytext character set cp1251 NOT NULL,
PRIMARY KEY (`id_user`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

->За подобную фильтрацию е-мэйл следует расстреливать.
->За хранение пароля - тоже.
->И это... заголовок бы поглядели. как отправляется в php... а то мета эта ... позорище ведь...

тогда вам прямо в БХВ-Петербург, там 2 автора есть )))))

  Ответить  
 
 автор: Trianon   (10.11.2010 в 13:54)   письмо автору
 
   для: lightning.say   (10.11.2010 в 11:59)
 

>1./* 40100 DEFAULT CHARACTER SET latin1 */
> ) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=latin1

latin1 значит.
Еще вопросы остались?

>->За подобную фильтрацию е-мэйл следует расстреливать.
>->За хранение пароля - тоже.
>->И это... заголовок бы поглядели. как отправляется в php... а то мета эта ... позорище ведь...

>тогда вам прямо в БХВ-Петербург, там 2 автора есть )))))

Простите, мне туда з-зачем? ))

  Ответить  
 
 автор: lightning.say   (10.11.2010 в 14:51)   письмо автору
 
   для: Trianon   (10.11.2010 в 13:54)
 

->ну как зачем? - расстрелять )))

да, но в другой таблице cp1251 по умолчанию а вопросы все равно выходят... ;(

вот у меня есть таблица

product CREATE TABLE `product` (
`id_product` int(11) NOT NULL auto_increment,
`equipment` tinytext NOT NULL,
`quantity` tinyint(20) NOT NULL default '0',
`serial` tinytext NOT NULL,
`hide` enum('show','hide') NOT NULL default 'show',
`pos` int(11) NOT NULL default '0',
`id_catalog` int(8) NOT NULL default '0',
PRIMARY KEY (`id_product`),
KEY `id_catalog` (`id_catalog`)
) ENGINE=MyISAM AUTO_INCREMENT=58 DEFAULT CHARSET=cp1251

заметь, DEFAULT CHARSET=cp1251
отправляю данные через форму:

  if($title == "") $titlepage=$title = "Добавление оборудования";
  if(!isset($button)) $button = "Добавить";
  if(!isset($action)) $action = "addprod.php";
  if(!isset($showhide)) $showhide = "checked";
  if(!isset($pos))
  {
    $query = "SELECT MAX(pos) FROM product
              WHERE id_catalog=".$_GET['id_parent'];
    $num = mysql_query($query);
    if($num) $pos = mysql_result($num,0) + 1;
  }
?>
<table><tr><td>
<p class=boxmenu><a class=menu href="index.php?id_catalog=<? echo $id_catalog?>&id_parent=<? echo $id_parent ?>">Вернуться в администрирование каталога</a></p>
</td></tr></table>

<form action=<?php echo $action?> method=post>
<table>
<tr>
  <td><p class=zag2>принадлежность</td>
 </tr>
<tr><td><p class=zag2>оборудование</td><td><input size=61 class=input type=text name=equipment value='<?php echo $equipment?>'></td></tr>
<tr>
  <td><p class=zag2>количество(шт)</td>
  <td>
    <select class=input type=text name=quantity>
     <option value=1 <?php if($quantity==1) echo "selected"?>>1
     <option value=2 <?php if($quantity==2) echo "selected"?>>2
     <option value=3 <?php if($quantity==3) echo "selected"?>>3
     <option value=4 <?php if($quantity==4) echo "selected"?>>4
     <option value=5 <?php if($quantity==5) echo "selected"?>>5
     <option value=6 <?php if($quantity==6) echo "selected"?>>6
    </select>
  </td>
</tr>
<tr><td><p class=zag2>серийный номер</td><td><input size=61 class=input type=text name=serial value='<?php echo $serial?>'></td></tr>
<tr><td><p class=zag2>Позиция</td><td><input class=input type=text name=pos value='<?php echo $pos?>'></td></tr>
<tr><td><p class=zag2>Отображать</td><td><input type=checkbox name=hide <?php echo $showhide?>></td></tr>
<tr><td></td><td><input class=button type=submit value=<?php echo $button?>></td></tr>
<input type=hidden name=id_catalog value=<?php echo $_GET['id_catalog']; ?>>
<input type=hidden name=id_product value=<?php echo $_GET['id_product']; ?>>
</table>
</form>


addprod.php

  if(!isset($_POST['equipment'])) links($_POST['id_catalog'], "Отсутствует оборудование");
  if(!isset($_POST['pos'])) links($_POST['id_catalog'], "Не введена позиция продукта");
  if($_POST['hide'] == "on") $showhide = 'show';
  else $showhide = 'hide';
  $_POST['serial'] = str_replace("'","`",$_POST['serial']);
  $_POST['equipment'] = str_replace("'","`",$_POST['equipment']);
  $query = "INSERT INTO product VALUES (
            NULL,
            '".$_POST['equipment']."',
            ".$_POST['quantity'].",
             ".$_POST['serial'].",
            '$showhide',
            ".$_POST['pos'].",
            ".$_POST['id_catalog'].")";
  if(mysql_query($query)) {
    echo "<HTML><HEAD>
          <META HTTP-EQUIV='Refresh' CONTENT='0; URL=index.php?id_parent=".$_POST['id_catalog']."'>
          </HEAD></HTML>";
  } else puterror("Ошибка при добавлении продукции");
  function links($id_catalog,$msg)
  {
    echo "<p>".$msg."</p>";
    echo "<p><a href=# onClick='history.back()'>Вернуться к правке продукта</a></p>";
    echo "<p><a href=index.php?id_parent=$id_catalog>Администрирование каталога продукции</a></p>";
    exit();
  }


config.php

  $dblocation = "localhost";
  $dbname = "site";
  $dbuser = "root";
  $dbpasswd = "pswd";

$dbcnx = @mysql_connect($dblocation,$dbuser,$dbpasswd);
mysql_query("SET character_set_client='cp1251'");
mysql_query("SET character_set_results='cp1251'");
mysql_query("SET character_collation_connection='cp1251_general_ci'");

  if (!$dbcnx)
  {
    echo( "<P>В настоящий момент сервер базы данных не доступен, поэтому корректное отображение страницы невозможно.</P>" );
    exit();
  }

  if (! @mysql_select_db($dbname,$dbcnx) )
  {
    echo( "<P>В настоящий момент база данных не доступна, поэтому корректное отображение страницы невозможно.</P>" );
    exit();
  }
  function puterror($message)
  {
    echo("<p>$message</p>");
    exit();
  }

вводишь данные на русском и всё, в бд одни вопросы.... почему?

и ваша команда
show create database site;
/* default character set cp1251 */

  Ответить  
 
 автор: Trianon   (10.11.2010 в 15:59)   письмо автору
 
   для: lightning.say   (10.11.2010 в 14:51)
 

Запрос
SHOW VARIABLES LIKE 'char%'; 

выполненный из-под скрипта что показывает?
Случ чего, результат такого запроса выводится точно также, как результат произвольного запроса SELECT .

  Ответить  
 
 автор: Trianon   (10.11.2010 в 16:02)   письмо автору
 
   для: lightning.say   (10.11.2010 в 14:51)
 

>->ну как зачем? - расстрелять )))
ну дык БХВ покамест здесь кривым кодом не пачкают.
а так, если есть желание - вперед :)

  Ответить  
 
 автор: lightning.say   (10.11.2010 в 16:46)   письмо автору
 
   для: Trianon   (10.11.2010 в 16:02)
 

все заработало!! хе, забыл добавить...
mysql_query("SET NAMES cp1251")
почему-то думал что надо для вывода из бд, для передачи данных оказывается тоже...
спасибо!

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования