Forum Webscript.Ru

Программирование => PHP => Тема начата: Matold от 06 Января 2004, 01:24:58

Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 01:24:58
Не могу занести данные в базу mysql, непонимаю...
$Query = "INSERT into $TableName (id, FirstName, LastName, EmailAddress, Comments) values ("5", "$Array[FirstName]",
"$Array[LastName]", "$Array[Email]", "$Array[Comments]")";

Так вот, выдает Parse error в этой строке... Подскажите plzz
Название: Не могу найти ошибку в этой строке
Отправлено: Yukko от 06 Января 2004, 01:38:28
наверное он ругается на кавычки внутри кавычек, перед которыми в таком случае слэш ставят...
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 01:48:54
Спасибо! Действительно не нравилась ему такая форма записи :)
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 01:54:34
Так, а вот опять проблема, уже с просмотром базы:



Просмотр базы


$Host = "database.agava.ru";
$User = "xxx";
$Password = "123";
$DBName = "xxx";
$TableName = "Feedback";
$Link = mysql_connect($Host, $User, $Password);
$Query = "SELECT * from $TableName";
$Result = mysql_db_query ($DBName, $Query, $Link);
print ("\\n");
print ("\\n");
print ("\\n");
print ("\\n");
print ("\\n");
print ("\\n");
while ($Row = mysql_fetch_array ($Result)) {
print ("\\n");
print ("\\n");
print ("\\n");
print ("\\n");
print ("\\n");
mysql_close ($Link);
?>



 
Этот скрипт должен всю базу выводить в таблицу, но при выполнении ругается Parse error на последнюю строку :(
Опять я какую-то лажу сделал
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 07:41:39
учись отлавливать парсе ерроры сам.
со всеми на форум не набегаешься.

ищи - где не закрыл кавычку, или фигурную скобку.
зачем ты наплодил столько принтов?
почему нельзя просто написать чистым html?

И еще пара замечаний:
нельзя писать $Array[Email], а надо $Array[\'Email\'], иначе можешь словить глюк.
mysql_db_query - устаревшая функция, на нормальном хостинге работать не будет.
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 13:10:42
Да, мне очень стыдно, что из-за такой дурацкой ошибки пришлось в форум писать (забыл "}" - просто ужастно :] ), просто я первый раз с mySQL работаю, боялся что ошибка в новых для меня функциях.
 RomikChef, а вот если писать  $Array[\'Email\'], то будет "parse error, expecting `T_STRING\' or `T_VARIABLE\' or `T_NUM_STRING\' ", а вот за все остальные советы - GREAT THANKS
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 15:57:25
ты правда такой дурак, или прикидываешься?
за именно этот совет надо говорить GREAT THANKS
повторяю для слабослышащих:
так, как ты пишешь - НЕПРАВИЛЬНО.
РНР позволяет так писать, но
1. Так писать неправильно. Правила такие в РНР. строка ВСЕГДА заключается в кавычки. Без кавычек пишутся константы
2. Может вовсе не работать в будущих версиях РНР.
3.Это может привести к ОЧЕНЬ трудно уловимым ошибкам.

Поэтому вместо того, чтобы отмахиваться от этого замечания, надо переделать свою программу.
и писать правильно:

$Query = "INSERT into $TableName (id, FirstName, LastName, EmailAddress, Comments) values (\'5\',\'".$Array[\'FirstName\']."\',\'".$Array[\'LastName\']."\',\'".$Array[\'Email\']."\',\'".$Array[\'Comments\']."\')";
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 16:21:44
Если же учесть, что у тебя массив, да еще в котором имена ключей совпадают с именами полей, можно сделать еще проще.

В этом и заключается программирование!
Вместо тупого перечисления полей, сделать это автоматом!

сначала у тебя в запросе перечисляются поля.
во-первых, если ты заполняешь их все, то эту часть запроса можно вообще опустить.
insert into table values (,,,)
во-вторых, если все же перечислять, то можно сделать это автоматом.
получить имена ключей массива - array_keys()
сделать из них строку - implode
в итоге:
$query="INSERT INTO $TableName (".implode(",",array_keys($Array)).") values ....";
то же самое делаем со значениями, и пролучаем в итоге
$query="INSERT INTO $TableName (".implode(",",array_keys($Array)).") values (\'".implode("\',\'",$Array)."\');
ну, или если без перечисления полей, то так:
$query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\');
Так ты убиваешь кучу зайцев: получается универсальный запрос не зависящий от состава и количества полей.
получается синтаксически правильный запрос.
Избегаешь возможных ошибок при ручном вводе.

И еще.
в первом примере нет поля id
что-то я сомневаюсь, что жесткое указание 5, как в твоем примере - это правильно.
правильнее не указывать его вовсе или писать 0.
Если у тебя есть возражения - я тебя обязательно выслушаю и объясню, в чем ты неправ. :-)

На дурака не обижайся :-)
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 18:11:15
Так вот, даже если писать так:
$Query = "INSERT into $TableName (id, FirstName, LastName, EmailAddress, Comments) values (\'0\', \' \\".$Array[\'FirstName\'].\\" \',\' \\".$Array[\'LastName\'].\\"\',\' \\".$Array[\'Email\'].\\"\',\'\\".$Array[\'Comments\'].\\"\')";  то все равно выходит "parse error, expecting `T_STRING\' or `T_VARIABLE\' or `T_NUM_STRING\' ",
однако без кавычек все ОК


Цитировать
в первом примере нет поля id
что-то я сомневаюсь, что жесткое указание 5, как в твоем примере - это правильно.
правильнее не указывать его вовсе или писать 0.

Да нет, в проге у меня "0", но просто сначала хотел указать частный случай, а потом передумал ^-^

А вот перед values  все-таки перечисляю столбцы, тк есть еще и другие
Название: Не могу найти ошибку в этой строке
Отправлено: Phoinix от 06 Января 2004, 18:49:47
Matold
Я думаю, нужно все таки почитать что такое . и зачем она нужна... как только ты пймешь, что это такое... я думаю ты поймешь конструкции \\" в твоем коде - гупость.

Странно, что так сложно переписать готовый код, причем правильный, а потом, решив, что тебя все-таки здесь надули, внести свои "правильные" коррективы...
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 19:15:34
мда.
тяжелый случай.
человеку дают ГОТОВЫЙ правильный пример,а он в ответ на это зачем-то пишет кривой.
зачем?

человеку даютболее красивое и правильное решение, как сделать автоматом, а он цепляется опять за свою кривизну...

Слушай, Matold, в меня сомнения закрадываются.
Ты вообще читал, что я тебе написал-то?
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 20:43:13
Цитировать
Phoinix:
Странно, что так сложно переписать готовый код, причем правильный, а потом, решив, что тебя все-таки здесь надули, внести свои "правильные" коррективы...

Цитировать
RomikChef: ну, или если без перечисления полей, то так: $query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\');


Так вот, в коде  RomikChef\'a не хватает " в конце строки перед ; , так что меня здесь "надули" :)
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 20:53:24
Так вот, тупо перекопировав код и добавив " получилось так:
$Host = "database.agava.ru";
$User = "xxx";
$Password = "xxx";
$DBName = "xxx";
$TableName = "Feedback";
$Link = mysql_connect($Host, $User, $Password);
//$Query = "INSERT into $TableName values (\\"0\\", \\"$Array[FirstName]\\", \\"$Array[LastName]\\", \\"$Array[Email]\\", \\"$Array[Comments]\\")";
$query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\')";
if (mysql_db_query ($DBName, $Query, $Link)) {
echo "обновлены данные таблицы $TableName.
\\n";
echo "\\n ";
} else {
echo "Не удается обновить таблицу $TableName.
\\n";
}
mysql_close ($Link);
?>
Так вот, при выполнении получаю "Не удается обновить таблицу"
НО если это ГОТОВЫЙ правильный пример, то почему такой результат выполнения? (однако если поменять местами //  перед $query и $Query то все работает ???
Название: Не могу найти ошибку в этой строке
Отправлено: Phoinix от 06 Января 2004, 21:16:31
Цитировать
$Query = "INSERT into $TableName (id, FirstName, LastName, EmailAddress, Comments) values (\'5\',\'".$Array[\'FirstName\']."\',\'".$Array[\'LastName\']."\',\'".$Array[\'Email\']."\',\'".$Array[\'Comments\']."\')";


Где тут не хватает кавычки???

Ответь на вопрос зачем были поставлены точки перед и после переменных, и сразу же вопрос стоит ли в этом случае ставить слеши перед кавычками? и соответсвенно почему???
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 21:19:08
тебя здесь не надувают.
Тебя здесь УЧАТ ка делать правильно.
Не пишут за тебя готовый код, а учат.
показывают.
Я, кроме готовых строчек, еще и пояснения разные словами делал.
Но по-моему, слова до товарищя либо не доходят вовсе, либо доходят очень туго.

Если ты не понял, как пользоваться с помощью программирования, возьми пример, где просто тупо написана строка, как у тебя, но ПРАВИЛЬНО. Если там есть опечатка - исправь ее самостоятельно.

Если ты не понимаешь, как сделать самостоятельно, надо спросить, что не понял.
А не бежать обратно на форум с криками - у меня не работает!!!

Скажи, ты головой хоть иногда думаешь?
Ты же сам только что писал -
Цитировать
А вот перед values все-таки перечисляю столбцы, тк есть еще и другие

и тут же берешь код, в котором столбцы не перечислены
Цитировать
$query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\')";


складывается все-таки, впечатление, что ты даже не пытаешься, понять, что означает тот или иной пример, а слепо запихиваешь в код и смотришь, что получится.
Неужели так трудно подумать и спросить, что непонятно?
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 21:26:19
у меня имя переменной в примере написано с маленькой буквы, а у него - с большой.
вот что значит копировать не метод, не умение, не знание, а тупо, как обезьяна, просто передирать код, не понимая его смысла
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 22:10:11
вот.
Раз уж ты ничего, кроме готового кода не воспринимаешь - вот тебе готовый и правильный.
Если есть вопросы - обращайся.

$Host = "database.agava.ru";
$User = "xxx";
$Password = "xxx";
$DBName = "xxx";
$TableName = "Feedback";
mysql_connect($Host, $User, $Password) or die (mysql_error());
mysql_select_db($DBName) or die (mysql_error());
$Query="INSERT INTO $TableName (".implode(",",array_keys($Array)).") values (\'".implode("\',\'",$Array)."\')";
if (mysql_query($Query)) {
  header("Location: sql_feedback_view.php");
  exit;
} else {
  echo "Не удается обновить таблицу $TableName.
\\n";
  echo "Ошибка: ".mysql_error()."
\\n";
  echo "Запрос: $Query
\\n";
}
?>

Код я не проверял, если есть опечатки - постарайся исправить их сам.
Если ты действительно хочешь научиться правильно писать на РНР.
Если нет - только скажи - я закрою эту тему и мы расстанемся друзьями.
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 22:54:21
Цитировать
и тут же берешь код, в котором столбцы не перечислены

Так как я уменьшил таблицу, поэтому не стал перечислять столбцы.

Цитировать
Неужели так трудно подумать и спросить, что непонятно?
человеку дают ГОТОВЫЙ правильный пример

Вот мне и не понятно, если ты объясняешь что пример правильный и готовый, то почему результат кода
$Host = "database.agava.ru";
$User = "xxx";
$Password = "xxx";
$DBName = "xxx";
$TableName = "Feedback";
$Link = mysql_connect($Host, $User, $Password);
//$Query = "INSERT into $TableName values (\\"0\\", \\"$Array[FirstName]\\", \\"$Array[LastName]\\", \\"$Array[Email]\\", \\"$Array[Comments]\\")";
$query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\')";
if (mysql_db_query ($DBName, $Query, $Link)) {
echo "обновлены данные таблицы $TableName.
\\n";
echo "\\n ";
} else {
echo "Не удается обновить таблицу $TableName.
\\n";
}
mysql_close ($Link);
?>

при выполнении выдает "Не удается обновить таблицу" ??? Я написал абсолютно как ты сказал:
Цитировать
ну, или если без перечисления полей, то так:

$query="INSERT INTO $TableName values (0,\'".implode("\',\'",$Array)."\');

Так ты убиваешь кучу зайцев: получается универсальный запрос не зависящий от состава и количества полей.
получается синтаксически правильный запрос.
Избегаешь возможных ошибок при ручном вводе.


Цитировать

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

Тут я тебя не понимаю... //$Query=... Это то, что у меня работало, но чтобы не стирать я ее поместил в комментарий.
То что ты сказал - $query я вставил в программу. Ну так объясни, ПОЧЕМУ НЕ РАБОТАЕТ ? Причем здесь "копировать не метод, не умение, не знание, а тупо, как обезьяна, просто передирать код, не понимая его смысла" Я понимаю смысл своего кода, и он действует, но если вставить твой код, то не база не обновляется
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 06 Января 2004, 23:02:25
Цитировать
Я думаю, нужно все таки почитать что такое . и зачем она нужна... как только ты пймешь, что это такое... я думаю ты поймешь конструкции \\" в твоем коде - гупость.

Если не секрет, где найти про . ? (Вернее как найти? В руководстве php поиск точки ничего не дает) Насколько я знаю она складывает 2 строки, но не понимаю как относиться к данному примеру
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 06 Января 2004, 23:38:00
Цитировать
Matold:
Вот мне и не понятно, если ты объясняешь что пример правильный и готовый,

ты смеешься что ли надо мной?
по-моему, ты издеваешься.
Правильный код, который я тебе дал, выводит ПРИЧИНУ, почему  "Не удается обновить таблицу" , а не только это тупое сообщение.

Цитировать
Matold:
То что ты сказал - $query я вставил в программу

ты вставил $qery, а дальше у тебя, в следующей строчке запрашивается $Qery
Об этом я тебе толкую, но до тебя не доходит!
Цитировать
Matold:
ПОЧЕМУ НЕ РАБОТАЕТ

объяснение одно - опечатки.
Которые надо найти и исправить.
У тебя есть другое мнение?
или ты считаешь, что я тебе эту опечатку телепатическим путем вычислю?


Давненько я не встречал такого мутного клиента.
Название: Не могу найти ошибку в этой строке
Отправлено: Matold от 07 Января 2004, 00:26:18
Цитировать
$qery, а дальше у тебя, в следующей строчке запрашивается $Qery

Ах черт! Все спасибо, я не знал что к регистру чувствителен PHP, я это просто для удобства называл с большой :))
ОГРОМНОЕ СПАСИБО НУ Я И ИДИОТ. Все, тему можно закрыть :)
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 07 Января 2004, 00:32:02
точно, все работает?
ты уж на меня не обизайся за резкость.
устал я что-то...
Название: Не могу найти ошибку в этой строке
Отправлено: FreeSpace от 07 Января 2004, 01:20:36
Я бы добавил сюда addslashes:
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 07 Января 2004, 02:49:17
А я бы не добавил.
зачем?
Название: Не могу найти ошибку в этой строке
Отправлено: FreeSpace от 07 Января 2004, 07:00:22
Я не совсем понял. Ты спрашиваешь у меня, зачем делать addslashes перед добавлением данных в БД? :)
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 07 Января 2004, 14:30:09
в общем, да.
Будь добр - прочти фак об этом у меня в подписи.
и в той форме, в которй ты это здесь написал, никогда больше не делай.
Название: Не могу найти ошибку в этой строке
Отправлено: FreeSpace от 07 Января 2004, 20:54:33
Спасибо, твой фак я уже давно читал. Но на всякий случай перечитал ещё раз - может там что-то новенькое появилось :)
Не мог бы ты нормально ответить, чем тебе не понравилось моё дополнение?
Если речь идет о magic_quotes_gpc, то лично я считаю значение off нормальным для этой директивы. Либо в начале скрипта делать проверку и при необходимости чистить соответствующие массивы от слешей. Из этих предпосылок я и исходил. Или ты с этим не согласен?
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 08 Января 2004, 02:12:50
я не согласен с тем, как ты это выдал здесь - безапелляционно и безкондиционно втулить аддслашес.
9:1 за то, что у него слеши добавляются автоматом.
админ его хостинга, увы, не спросил тебя, что ты считаешь нормальным.
А жалобы ламеров "ай меня поломали!!!" ни один админ слушать не хочет.
И если сделать, как ты написал, то добавятся лишние.
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 08 Января 2004, 02:14:20
Matold, если ты еще слушаешь

учитывая замечание FreeSpace, можно уже сделать функцию, которая будет за нас выполнять всю рутинную работу.
с такой функцией скрипт станет компактнее и более удобочитаем.
Ее можно поместить в файл, который инклюдится во все скрипты, и пользоваться в любом месте.

function sqlInsert($TableName,$Array) {
  if (get_magic_quotes_gpc()) foreach ($Array as $k=> $v) $Array[$k]=mysql_escape_string($v);
  $Query="INSERT INTO $TableName (".implode(",",array_keys($Array)).") values (\'".implode("\',\'",$Array)."\')";
  if (!mysql_query($Query)) return FALSE;
  return mysql_insert_id();
}

первая строчка проверяет, надо ли добавить слеши, и добавляет.
вторая - формирует запрос.
третья - исполняет и если в запросе была ошибка, возвращает ложь. вс скрипте можно это проверить и обработать.
Либо, еще обработку ошибки можно поместить и в саму функцию.

последняя строчка получает id и возвращает его.
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 08 Января 2004, 02:20:19
Цитировать
Matold:
я не знал что к регистру чувствителен PHP

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

имена функций не чувствительны
Название: Не могу найти ошибку в этой строке
Отправлено: FreeSpace от 08 Января 2004, 03:02:33
RomikChef
Благодарен за конструктивную критику, со всем согласен.
Только исправь маленькую очепятку:
Цитировать
RomikChef:
foreach ($Array ad $k=> $v)

А то любители копи-пейста будут жаловаться на parse error\'ы :)
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 08 Января 2004, 03:05:10
спасибо.
у тебя глаз-алмаз!
Name Mail Comments
$Row[FirstName] $Row[LastName] $Row[EmailAddress] $Row[Comments]