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

Форум PHP

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

 

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

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

тема: правильная запись в БД
 
 автор: Dizels   (17.03.2010 в 13:31)   письмо автору
 
 

Пытаюсь записать в БД значение Бренд\Original\ - т.е. именно со знаками \
Перед записью выводил данные - все передается, но в таблицу не записывается почему-то.
Чувствую, что это как раз из-за слешей - вопрос такой как все же это записать или же как записать только ту часть которая между слешами, т.е. в данном случае слово Original

  Ответить  
 
 автор: Trianon   (17.03.2010 в 13:33)   письмо автору
 
   для: Dizels   (17.03.2010 в 13:31)
 

попробуйте для начала надежно записать в БД (и затем прочитать из нее) один слэш.
Затем то же самое попробуйте сделать со строкой
brand\noname
.
Именно с этими двумя словами, именно строчными буквами, и без пробелов.

  Ответить  
 
 автор: Dizels   (17.03.2010 в 19:31)   письмо автору
 
   для: Trianon   (17.03.2010 в 13:33)
 

<?php
// Соединяемся с базой данных
require_once("config.php");
$tov_mat "brand\noname";
// Преобразуем кодировку
$tov_mat iconv("UTF-8""windows-1251"$tov_mat);
// Экранируем слеш
addslashes($tov_mat);
$y "INSERT INTO te VALUES (NULL,'$tov_mat')";        
print 
$y;                        
if(
mysql_query($y))
    {
        echo 
"Данные добавлены в БД<br>";
    }
echo 
"<br><b>ЗАВЕРШЕНО!</b><br>";    
echo 
"<a href='index.php'>назад к управлению каталогом</a>";
?>

По идее должно быть так, но почему-то не получается. Подскажите что я сделал не правильно.

  Ответить  
 
 автор: Trianon   (17.03.2010 в 19:43)   письмо автору
 
   для: Dizels   (17.03.2010 в 19:31)
 

неправильно у Вас сразу в двух местах.
Чтобы понять главную ошибку, которая с базой совсем не связана, попробуйте перед строкой
// Преобразуем кодировку
добавить строку echo $tov_mat;
и посмотреть на промежуточный вывод.

Второе место я подскажу, так как оно менее тривиально, и проявляется достаточно редко.
вместо addslashes следует испльзовать mysql_real_escape_string

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

  Ответить  
 
 автор: Dizels   (17.03.2010 в 19:50)   письмо автору
 
   для: Trianon   (17.03.2010 в 19:43)
 

brand\noname - то что здесь \n преобразуется в перенос строки - я понял, но я почему-то подумал, что
addslashes($tov_mat); 
как раз и должно убирать это преобразование.

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

Теперь по самому коду, видимо я вставляю куда-то не туда или не в той последовательности:
$tov_mat = "brand\noname";
mysql_real_escape_string($tov_mat);
echo $tov_mat;

выдает:
brand oname

Т.е. экранирования не происходит, но как его тогда записать я чего-то совсем не пойму.

  Ответить  
 
 автор: Trianon   (17.03.2010 в 19:55)   письмо автору
 
   для: Dizels   (17.03.2010 в 19:50)
 

>brand\noname - то что здесь \n преобразуется в перенос строки - я понял,

Здесь ничего не преобразуется. Не было вызвано никакой функции, чтобы что-то преобразовывалось.
Здесь просто нет этих символов \ n . Есть символ перевода строки. Так что и преобразовывать нечего.


>но я почему-то подумал, что addslashes($tov_mat); как раз и должно убирать это преобразование.

Соответственно addslashes вызывается совсем не затем, чтобы что-то убрать.
Я сказал "поставить диагностический вывод " до этой функции, а не после.
Значит к этому моменту в переменной должно быть корректное значение.

Добивайтесь.

  Ответить  
 
 автор: neadekvat   (17.03.2010 в 19:45)   письмо автору
 
   для: Dizels   (17.03.2010 в 19:31)
 

Тю, только Trianon'a в посте вспомнил, он уж вперед меня написал =)

  Ответить  
 
 автор: Trianon   (17.03.2010 в 19:49)   письмо автору
 
   для: neadekvat   (17.03.2010 в 19:45)
 

По обоим моментам.
Так можно писать.
Слегка неряшливо получается, но в принципе несмертельно.
NULL в автоинкрементном поле является признаком запроса на генерацию нового ключа.
А набор и порядок подразумеваемых полей соответсвует описанию таблицы в операторе CREATE TABLE.

А вот удалять значимый текст - мерзко.

  Ответить  
 
 автор: neadekvat   (17.03.2010 в 19:54)   письмо автору
 
   для: Trianon   (17.03.2010 в 19:49)
 

Ну, когда я пишу запросы - то стараюсь избегать этих null, чтобы в коде было только нужное. Хоть и работаю только с mysql, но наверняка другие субд сгенерироруют новый ключ в любом случаи.

> А вот удалять значимый текст - мерзко.
Сначала показалось, что у меня получилось то же, что и у вас. Что может быть глупее, чем та же мысль следом.

  Ответить  
 
 автор: Dizels   (17.03.2010 в 19:55)   письмо автору
 
   для: neadekvat   (17.03.2010 в 19:54)
 

neadekvat и Trianon - толи часть ваших сообщений потерлась, то ли я уже ничего не понимаю:))

  Ответить  
 
 автор: Trianon   (17.03.2010 в 19:57)   письмо автору
 
   для: Dizels   (17.03.2010 в 19:55)
 

А Вы не отвлекайтесь, этот диалог к проблеме отношения не имеет.

  Ответить  
 
 автор: Dizels   (17.03.2010 в 19:58)   письмо автору
 
   для: Trianon   (17.03.2010 в 19:57)
 

Вот мое последнее сообщение автор: Dizels (17.03.2010 в 19:50) там как бы изложил текущее состояние дел)

  Ответить  
 
 автор: Trianon   (17.03.2010 в 20:05)   письмо автору
 
   для: Dizels   (17.03.2010 в 19:58)
 

Вот мой ответ автор: Trianon (17.03.2010 в 19:55)
там как бы показал, что с php-строками у Вас плохо безо всякой базы.
И я не понимаю, как такое может быть.

  Ответить  
 
 автор: Trianon   (17.03.2010 в 20:01)   письмо автору
 
   для: neadekvat   (17.03.2010 в 19:54)
 

>Сначала показалось, что у меня получилось то же, что и у вас.
>Что может быть глупее, чем та же мысль следом.


На прочтение время тратися, на обдумывание, на изложение мысли.
Так что равные ответы - вовсе не повод для расстройства, а скорее подтверждение правильности логики.
На самом деле все ж понимают, что ответы пишутся не мгновенно.
А те, кто не понимает... Неужели мнение такого человека Вас как-то трогает?

  Ответить  
 
 автор: neadekvat   (17.03.2010 в 20:06)   письмо автору
 
   для: Trianon   (17.03.2010 в 20:01)
 

И не поспоришь =)
Впредь зарекаюсь удалять информативную часть поста.

  Ответить  
 
 автор: Dizels   (17.03.2010 в 20:11)   письмо автору
 
   для: neadekvat   (17.03.2010 в 20:06)
 

Вот как я понимаю логику данного кода:
$tov_mat = "brand\noname";
mysql_real_escape_string($tov_mat);
echo $tov_mat;

1 строчка - присваиваем переменной значение.
2 строчка - экранируем переменную
3 строчка - выводим ее.

Как я понимаю - проблема в том, что во время исполнения 1 строки уже происходит преобразование \n в перенос строки, т.е. во второй строке уже просто нечего экранировать. Но вот как правильно это записать - не могу понять.

  Ответить  
 
 автор: neadekvat   (17.03.2010 в 20:18)   письмо автору
 
   для: Dizels   (17.03.2010 в 20:11)
 

Вам же уже посоветовали использовать mysql_real_escape_string().

  Ответить  
 
 автор: Dizels   (17.03.2010 в 20:23)   письмо автору
 
   для: neadekvat   (17.03.2010 в 20:18)
 

Понял в чем проблема, вот как надо (для тех кто тоже столкнулся с такой проблемой):
$tov_mat = "brand\noname";
$zz=mysql_real_escape_string($tov_mat);
echo $zz;

  Ответить  
 
 автор: Dizels   (17.03.2010 в 20:29)   письмо автору
 
   для: Dizels   (17.03.2010 в 20:23)
 

Собственно обрадовался я рано, в приведенном выше коде выводится все как надо, однако при добавлении в БД все равно записывается
brand
oname

Вот код на текущий момент:
<?php
// Соединяемся с базой данных
require_once("config.php");
$tov_mat "brand\noname";
$zz=mysql_real_escape_string($tov_mat);
echo 
$zz;
$y "INSERT INTO te VALUES (NULL,'$zz')";        
print 
$y;                        
if(
mysql_query($y))
    {
        echo 
"Данные добавлены в БД<br>";
    }
echo 
"<br><b>ЗАВЕРШЕНО!</b><br>";    
?>

Ткните носом что не так?

  Ответить  
 
 автор: Рома   (17.03.2010 в 20:43)   письмо автору
 
   для: Dizels   (17.03.2010 в 20:29)
 

последовательность символов \n является частью языка, а вы этого до сих пор не знаете

  Ответить  
 
 автор: Dizels   (17.03.2010 в 20:48)   письмо автору
 
   для: Рома   (17.03.2010 в 20:43)
 

>последовательность символов \n является частью языка, а вы этого до сих пор не знаете
я это уже понял, но разве
$zz=mysql_real_escape_string($tov_mat); 

не исправляет эту ситуацию?

  Ответить  
 
 автор: Dizels   (17.03.2010 в 20:49)   письмо автору
 
   для: Dizels   (17.03.2010 в 20:48)
 

Сейчас вот написал ответ и сам понял, что собственно \n так и остается, поэтому в БД так и записывается.

Но вопрос от этого актуальность не потерял, как все таки обработать переменную, чтобы можно было внести эти значения в базу данных?

  Ответить  
 
 автор: Рома   (17.03.2010 в 21:06)   письмо автору
 
   для: Dizels   (17.03.2010 в 20:49)
 

>я это уже понял, но разве
>$zz=mysql_real_escape_string($tov_mat);
>не исправляет эту ситуацию?

нет. эта функция совсем для другого предназначена. в мануале же написано за чем она нужна.

>Но вопрос от этого актуальность не потерял, как все таки обработать переменную, чтобы можно
>было внести эти значения в базу данных?

можно.
присваивая строку переменной объясните скрипту, что в данной ситуации \n не является символом перевода строки, а является простой последовательностью символов.

  Ответить  
 
 автор: Trianon   (17.03.2010 в 21:31)   письмо автору
 
   для: Рома   (17.03.2010 в 21:06)
 

Дайте человеку подумать.

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

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