За последние 24 часа нас посетил 18051 программист и 1700 роботов. Сейчас ищут 1545 программистов ...

Генерация SQL запроса ???? ERROR!

Тема в разделе "PHP и базы данных", создана пользователем macik, 2 ноя 2006.

  1. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    Вроде посмотрел на форуме и не смог найти ответа.
    Проблема в следующем:
    Есть форма она создается автоматом в зависимости какие поля у таблицы в базе.
    Потом данные передаются на сервак (скрипт) там все перебирается на ненужные символы и тому подобное, в полях есть и html он экранируется addslashes.

    Потом я наздаю sql запрос вот так:
    PHP:
    1.  
    2. if ($error==0){
    3.     foreach($post_arr as $key=>$name){
    4.         if($key=='date'){
    5.             $name = $date_sys;
    6.         }else if($key=='time'){
    7.             $name = $time_sys;
    8.         }else if($key=='vie'){
    9.             $name = mt_rand(0, 10);
    10.         }else if($key=='md5'){
    11.             $name = md5($e_mail.''.$date_sys.''.$time_sys);
    12.         }
    13.         //$name = stripslashes($name);
    14.         $sql_insert.='`'.$key.'`, ';
    15.         if($key!='id'){
    16.             $sql_insert_post.=', "'.$name.'"';
    17.         }else{
    18.             $sql_insert_post.='"'.$name.'" ';
    19.         }
    20.     }
    21. }
    22.  
    23. $sql = 'INSERT INTO `'.$table.'` ('.$sql_insert.') VALUES ('.$sql_insert_post.')';
    24. $result = mysql_query($sql) or die('insert '.mysql_error());
    25.  
    Вот что выходит: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ') VALUES ('''' , ''1'', ''1'', ''Украины создала временную следс
     
  2. какой ужас
     
  3. Mavir

    Mavir Guest

    print $sql;
    и проверить запрос
     
  4. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    echo $sql;
     
  5. macik
    нельзя формировать список имён полей автоматом из данных поста.
    нельзя искать ошибки в запросе, ни разу даже не посмотрев, как он выглядит!
     
  6. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    $sql
    Код (Text):
    1. INSERT INTO `goods_pages_ru` (`id`, `goods`, `goods_section`, `headline`, `text`, `date`, `time`, `foto`, `vie`, ) VALUES ("" , "1", "1", "Украины создала временную следственную комиссию ", "<A href=\"http://lenta.ru/news/2006/11/02/rada/\"><IMG title=\".......", "2006-11-02", "15:36:07", "2006-11-02_15-36-08_wal_reb_500.jpg", "7")
     
  7. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    Чет я не понял из этого нечего...
     
  8. topas

    topas Активный пользователь

    С нами с:
    16 авг 2006
    Сообщения:
    2.258
    Симпатии:
    36
    ну вот теперь все видно, запята после `vie` лишняя... :)
     
  9. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    topas
    Блин в данных учел запятую, а в построении таблиц нет...
    Чебурген
    А в чем ужас, что не так?
    Подскажи?
     
  10. нельзя формировать список имён полей автоматом из данных поста.
    что тебе в этой фразе непонятно?
     
  11. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    Чебурген

    Я его не из поста формирую, а из базы данных.
    Плюс название переменных post и их значение проверяются на корректность и соответствие.
    Форма тоже формируется на основании базы данных.
    Или это плохо?
     
  12. не рассказывай мне сказки.
    foreach($post_arr as $key=>$name) - это называется из базы?
    если они действительно проверяются, то тогда да, можно.
    но лично я бы не стал доверять проверкам, а перечислил все поля в скрипте руками.
    то, как формируется форма, не имеет к вопросу ни малейшего отношения.
    форма ушла на клиент. всё! там с ней могут сделать всё что угодно. забудь как ты её формировал и из чего собирал.
     
  13. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    Я наверно з глупил по названиям переменных!
    работает так...
    PHP:
    1. $post_arr // это запрос SHOW FULL COLUMNS FROM
    // потом я оставляю только то, что есть в базе
    PHP:
    1. $post_arr[$row->Field]=$post[$row->Field];
    // ну а дальше проверки ...

    $post это и есть $_POST

    PS
    А по поводу формы я уже имел проблему с отправкой через мою форму спама, я ее решил тем, что создавал Кеш md5 и пихал его в сессию, потом проверял на сервере... и все. После этого спама не было.
     
  14. psoi

    psoi Активный пользователь

    С нами с:
    25 июн 2006
    Сообщения:
    65
    Симпатии:
    0
    Вопрос такой. У меня есть переменная $nomer. Я её получаю методом
    $nomer=$_GET['nomer'];
    Потом идет sql запрос к таблице с названием, которое хранится в єтой пременной. Вот так:

    $nomer=$_GET['nomer'];
    $query="SELECT* FROM `$nomer`;";
    mysql_query($query);

    Запрос не выполняется.
    Пробовал и так:

    $query="SELECT* FROM '$nomer';";

    и так:

    $query="SELECT* FROM $nomer;";

    и так:

    $query="SELECT* FROM \'$nomer\';";

    и даже так:

    $query="SELECT* FROM '`$nomer`';";

    и вот так:

    $query="SELECT* FROM {$nomer};";

    не работает... А вот если явно указать

    $query="SELECT* FROM 000456789;";

    то всё работает.

    У меня вопрос таков: Как в sql запросе обратится к имени таблицы, которая хранится в переменной??
     
  15. Davil

    Davil Guest

    1. Точка с запятой не нужны.
    2. Звезду подальше.
    3. Апострофы - зло.
    Результат:
    Код (Text):
    1. $query="SELECT * FROM ".$nomer;
     
  16. Davil
    где ты здесь увидел апострофы?
    И с чего ты взял, что они - зло?
     
  17. psoi
    Два замечания.
    1. Имя таблицы нельзя передавать через GET
    2. БД надо проектировать так, чтобы таблица была одна. Если у тебя куча таблиц с именами из циферок - значит, ты что-то неправильно сделал.
    И эти замечания гораздо важнее твоих примитивных проблем с генерацией текстовой строки с помощью PHP. Рекомендую над ними задуматься.
     
  18. Davil

    Davil Guest

    Чебурген
    Обратные апострофы. При данном применении это мое имхо.
     
  19. имхо твоё неправильное.
    "данное применение" ничем не отличается от любых других случаев составления запроса.
    согласно документации, элементы БД должны быть заключены в обратные одинарные кавычки.
    А зло - это, как раз, когда запрос составлен без них, и вылетает с ошибкой.
     
  20. Davil

    Davil Guest

    Т.е. ты заключаешь в запросах название таблицы в кавычки? Странно. У меня и без этого работает... Возможно строгое соответствие со стандартами не всегда предусматривается. А операторы и функции ты тоже в кавычки заключаешь?

    P.S. А зло - это засовывать переменную внутрь строки. Я это имел ввиду.
     
  21. psoi

    psoi Активный пользователь

    С нами с:
    25 июн 2006
    Сообщения:
    65
    Симпатии:
    0
    Хотите анекдот.
    Перенес скрипт на другой хостинг.
    Там ВСЁ работает. И переменная передается через get. И имя таблицы идет в запросе как переменная.
    "SELECT* FROM `$nomer`;";
    Ничего не понимаю.........
    з.ы. Мне как раз и нужно, чтобы под каждый номер была своя таблица. Как мне кажется так больше порядка и быстрее идёт работа.
     
  22. Анекдот здесь только один. Это твои таблицы, которых ты расплодил, как китайцев.
    И то, что ты не понимаешь русского языка.
     
  23. psoi

    psoi Активный пользователь

    С нами с:
    25 июн 2006
    Сообщения:
    65
    Симпатии:
    0
    Да. Я понял. Нужно всё лепить в одну таблицу. Даже если данные друг к другу никоим образом не относятся и структура таблиц разная. Тогда будет правильно :)
     
  24. macik

    macik Активный пользователь

    С нами с:
    14 июл 2006
    Сообщения:
    71
    Симпатии:
    0
    psoi
    Тебе ребята правильно говорят по поводу названий... ты посуди сам если у тебя будет около 100 таблиц ... ты без того чтобы не заглянуть в структуру таблицы не напишешь запрос вручную.
    Но это дело конечно личное ...
     
  25. Anonymous

    Anonymous Guest

    macik, для примера... у нас в главной базе на работе на данный момент 1867 таблиц. ;)