Программирование => 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
\\n"); while ($Row = mysql_fetch_array ($Result)) { print ("
\\n"); print ("
$Row[FirstName] $Row[LastName]
\\n"); print ("
$Row[EmailAddress]
\\n"); print ("
$Row[Comments]
\\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.Это может привести к ОЧЕНЬ трудно уловимым ошибкам.
Поэтому вместо того, чтобы отмахиваться от этого замечания, надо переделать свою программу. и писать правильно:
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 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
Ответь на вопрос зачем были поставлены точки перед и после переменных, и сразу же вопрос стоит ли в этом случае ставить слеши перед кавычками? и соответсвенно почему???
Название: Не могу найти ошибку в этой строке
Отправлено: Меняздесьдавнонет от 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