За последние 24 часа нас посетили 22918 программистов и 1263 робота. Сейчас ищут 747 программистов ...

Помогите новичьку с SQL запросом

Тема в разделе "PHP для новичков", создана пользователем ushkom, 29 ноя 2016.

Метки:
  1. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Доброго времени суток. Подскажите как правильно создать запрос. Я накидал как я понял, но выдает ошибку.
    Код (Text):
    1. $db->Query("UPDATE db_product_time SET status = 0 WHERE id_user = '$usid' and status = 1 and name = '$citem1' and ORDER BY date_del LIMIT $limit");
    То есть мне нужно обновить $limit количество строк, с сортировкой по дате
     
  2. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Ну, во-первых, хорошо бы показывать текст ошибки, предварительно переведя его самому и попытавшись понять смысл. А во-вторых, между последним условием и ORDER BY не нужно писать AND.
     
  3. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Вот ошибка
    Код (Text):
    1. 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 'ORDER BY date_del LIMIT 5)' at line 1
     
  4. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Хорошо, но я вам советовал как бы на будущее. Ответ я вам дал, т.к. в данном случае ошибка была очевидна.
     
    ushkom нравится это.
  5. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Все работает, все было из за AND. Два дня в интернете лазил, а проблема в AND. Спасибо большое
     
  6. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    askanim нравится это.
  7. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Подскажите пожалуйста, может можно по другому в данном случае запрос сделать
    Код (Text):
    1. if($qanak == 1){
    2. $zapros = "('$usid', '$citem', '$date_add', '$date_del', '1')";}
    3. if($qanak > 1){
    4. $zapros1 = "('$usid', '$citem', '$date_add', '$date_del', '1'),";
    5. $zapros2 = "('$usid', '$citem', '$date_add', '$date_del', '1')";
    6. $zapros3 = str_repeat($zapros1, $qanak - 1);
    7. $zapros = "$zapros3 $zapros2";
    8. }
    9.  
    10. $db->Query("INSERT INTO db_product_time (id_user, name, date_add, date_del, status) VALUE $zapros");

    $qanak это количество одинаковых строк которые нужно создать. Возможно это все дело сократить? Спасибо
     
  8. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    @ushkom, не рискну вас спрашивать зачем нужно N одинаковых строк, т.к. боюсь, что замучают ночные кошмары :) А по поводу "сократить", то можно же в цикле собрать эту часть запроса:
    PHP:
    1. <?php
    2.  
    3. $data = [];
    4. for($i = 0; $i <  $qanak; $i++) {
    5.    $data[] = "('$usid', '$citem', '$date_add', '$date_del', '1')";
    6. }
    7.  
    8. $db->Query("INSERT INTO `db_product_time` (`id_user`, `name`, `date_add`, `date_del`, `status`) VALUES " . implode(',', $data));
     
  9. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    А если если одна строка будет нужна то запятая не будет лишней?
    ',', $data
     
  10. Deonis

    Deonis Старожил

    С нами с:
    15 фев 2013
    Сообщения:
    1.521
    Симпатии:
    504
    Лишней запятой не будет. А вот проверить, перед выполнением запроса, что массив не пустой - желательно. Или же где-то выше по коду проверять, что $qanak > 0
     
  11. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Добрый день. Подскажите, если не сложно, где ошибка в запросе
    Код (Text):
    1. $now = time();
    2. $db->Query("SELECT * FROM db_product_time WHERE status=1 and date_del<=$now");
    3.  
    4. while($row = $db->FetchArray())
    5.  
    6. $id = $row['id'];
    7. $par = $row['name'];
    8. $user = $row['id_user'];
    9. $db->Query("UPDATE db_users_b SET $par = $par - 1 WHERE id = $user");
    10. $db->Query("UPDATE db_product_time SET status = 0, date_ob = $now WHERE id = $id");
    Не видит переменные

    Вот ошибка
    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 '= - 1 WHERE id =' at line 1
     
  12. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    а где там запрос?

    http://phpfaq.ru/debug
    PHP:
    1. $sql = "SELECT * FROM table";
    2. echo $sql;
    так ты получишь SQL запрос с подставлеными твоими переменными и мы сможем помочь и может ты сам догадаешься, потому как в переменных может быть такой текст, который ломает запрос, используй экранирование или подготовленные запросы
    http://phpfaq.ru/mysql/slashes
     
  13. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Не со
    не совсем понял, я пытаюсь переделать этот код
    Код (Text):
    1.     public function CheckTime()
    2.     {
    3.         $db = $this->db;
    4.         $now = time();
    5.         $sql = "select * from `db_product_time` where `status`=1 and `date_del`<=$now";
    6.         $db->Query($sql);
    7.         $arr = array();
    8.         if ($db->NumRows()>0)
    9.         {
    10.             while($row = $db->FetchArray())
    11.             {
    12.                 $arr[] = $row;
    13.             }
    14.         }
    15.         if (count($arr)>0)
    16.         {
    17.             foreach ($arr as $row)
    18.             {
    19.                 $id = $row['id'];
    20.                 $par = $row['name'];
    21.                 $user = $row['id_user'];
    22.                 $sql = "update `db_users_b` set `$par`=`$par`-1 where `id`=$user";
    23.                 $db->Query($sql);
    24.                 $sql = "update `db_product_time` set  `status`=0 where `id`=$id";
    25.                 $db->Query($sql);
    26.             }
    27.         }
    28.     }
     
  14. TeslaFeo

    TeslaFeo Старожил

    С нами с:
    9 мар 2016
    Сообщения:
    2.989
    Симпатии:
    759
    Первые знания тяжело даются :) Я уже забыл когда два дня над чем то бился)))
     
  15. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Все получилось, нужно было поставить всего навсего скобки
    Код (Text):
    1. $db->Query("SELECT * FROM db_product_time WHERE status = 1 and date_del <= '$radd'");
    2. while($row = $db->FetchArray()){
    3. $id = $row['id'];
    4. $par = $row['name'];
    5. $user = $row['id_user'];
    6. $db->Query("UPDATE db_users_b SET $par = $par - 1 WHERE id = '$user'");
    7. $db->Query("UPDATE db_product_time SET status = 0, date_ob = $radd WHERE id = '$id'");
    8. }
     
    TeslaFeo нравится это.
  16. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    этот код
    PHP:
    1. $db->Query("SELECT * FROM db_product_time WHERE status = 1 and date_del <= '$radd'");
    на такой
    PHP:
    1. echo "SELECT * FROM db_product_time WHERE status = 1 and date_del <= '$radd'";
    чтобы посмотреть какой запрос получается

    ты по ссылки статью читал? что в ней ней понятно?
     
    ushkom нравится это.
  17. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Уже все получилось, нужно было фигурные скобы поставить, я код выше показывал как я сделал. Статьи читал, к сожалению не во всем разобрался
     
  18. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    так можно спрашивать когда встречаешь текст который тебе не понятен

    но ты понял как получить SQL запрос который будешь в базу отправлять? вот его и надо смотреть на наличие ошибок
     
    ushkom нравится это.
  19. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Уже нет ошибок,все ок. Спасибо за помощь
     
  20. denis01

    denis01 Суперстар
    Команда форума Модератор

    С нами с:
    9 дек 2014
    Сообщения:
    12.230
    Симпатии:
    1.715
    Адрес:
    Молдова, г.Кишинёв
    так задачи научиться новому не стояло?
     
  21. ushkom

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

    С нами с:
    5 сен 2016
    Сообщения:
    68
    Симпатии:
    1
    Стояла, спасибо