За последние 24 часа нас посетили 20766 программистов и 1106 роботов. Сейчас ищут 362 программиста ...

Траблы с запросом к БД через php :C

Тема в разделе "PHP для новичков", создана пользователем Qeuvec, 3 апр 2020.

Метки:
  1. Qeuvec

    Qeuvec Новичок

    С нами с:
    3 апр 2020
    Сообщения:
    10
    Симпатии:
    0
    $resultate = mysqli_query($link, "INSERT INTO `post`
    (`IDPost`, `ContentText`, `DatePost`, `TextPost`, `AutorPost`)
    VALUES
    ('$IDColl', '$DescrColl', $CurDate, '$MainTextColl', '$AutorColl'");
    if ($resultate == false)
    {
    printf("ErrorMessage: %s\n", mysqli_error($link));
    }

    mysqli_error возвращает: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1.

    Как я понимаю в mysqli_error место ошибки показывается между одинарными кавычками, а в моей ошибке между ними пустота. Верчу этими кавычками уже час, наверное:(
     

    Вложения:

  2. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Если дата не числового типа, то ее значение тоже нужно заключать в кавычки.

    Плюс значения могут «бить» текст запроса. Например, 'ADMIN' (кавычки относятся к значению) будет бить текст запроса. Нужно экранировать или использовать подготовленный запрос.
    --- Добавлено ---
    Вообще хранить подобные значения в AutorPost – это не дело. Нормализуйте.
     
  3. Qeuvec

    Qeuvec Новичок

    С нами с:
    3 апр 2020
    Сообщения:
    10
    Симпатии:
    0
    $CurDate = 'CURRENT_DATE()'; Это до запроса определено. Также пробовал писать просто CURRENT_DATE(), ошибка та же.
    Разбил по строкам свой запрос, выяснилось, он ругается на последний элемент. Где-то после Автора..
    Значение по умолчанию стоит
    Код (Text):
    1. if (empty($AutorColl))
    2.     {
    3.         $AutorColl = 'ADMIN';
    4.     }
    А что за экранизация и что за "бить" я не понял :oops:
     
  4. miketomlin

    miketomlin Старожил

    С нами с:
    9 авг 2016
    Сообщения:
    3.789
    Симпатии:
    646
    Так нормально.

    Бить значит портить. Экранирование делает значения такими, которые бы не портили текст запроса (при этом их суть остается прежней). У MySQLi для этого есть спец. функция: mysqli_real_escape_string (mysqli_escape_string).
    --- Добавлено ---
    Так нормально. Но в запросе на скриншоте вы пытались изобразить немного другое ;)
     
  5. Qeuvec

    Qeuvec Новичок

    С нами с:
    3 апр 2020
    Сообщения:
    10
    Симпатии:
    0
    Ошибка та же :mad:
    Код (Text):
    1.  
    2. <?php
    3. function InsertColl($IDColl,$DescrColl,$AutorColl,$MainTextColl)
    4. {
    5.  require_once 'config.php';
    6.  if (empty($IDColl))
    7.  {
    8.  $IDColl = 'NULL';
    9.  }
    10.  else
    11.  {
    12.  $IDColl = "'$IDColl'";
    13.  }
    14.  if (empty($AutorColl))
    15.  {
    16.  $AutorColl = "ADMIN";
    17.  }
    18.  $CurDate = 'CURRENT_DATE()';
    19.  /* Экранирование */
    20.  $CurDate = $link->real_escape_string($CurDate);
    21.  $DescrColl = $link->real_escape_string($DescrColl);
    22.  $MainTextColl = $link->real_escape_string($MainTextColl);
    23.  print $IDColl; print $DescrColl; print $MainTextColl; print $AutorColl; echo '<br>';
    24.  /* Запрос */
    25.  $resultate = mysqli_query($link, "INSERTINTO `post` (`IDPost`, `ContentText`, `DatePost`, `TextPost`, `AutorPost`) VALUES ($IDColl, '$DescrColl', $CurDate, '$MainTextColl', '$AutorColl'");
    26.  if ($resultate == false)
    27.  {
    28.  printf("Error: %s\n", mysqli_error($link));
    29.  }
    30. }
    31. InsertColl($_POST['IDText'],$_POST['DescrText'],$_POST['AutorText'],$_POST['MainText']);
    32. ?>
    Вроде бы правильно списал с phpmanual :D
    Жалуется на пустоту ''
    Экранирование тоже и так и сяк пробовал и всё равно ошибка. Только иногда сам на себя ругается, так как ставит лишние знаки
     
  6. Valick

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

    С нами с:
    12 авг 2018
    Сообщения:
    1.911
    Симпатии:
    328
    Первое и самое главное! Сохраняйте сам текст запроса в отдельную переменную ( это вообще надо утвердить на законодательном уровне), что бы всегда можно было распечатать готовый запрос в браузер с подставленными значениями переменных и посмотреть глазами, что же вы пытаетесь спросить у БД.
    Этот же готовый запрос можно скопипастить из браузера и выполнить в пхпмайадмине.
     
  7. Qeuvec

    Qeuvec Новичок

    С нами с:
    3 апр 2020
    Сообщения:
    10
    Симпатии:
    0
    А можно поподробнее, как это организовать? o_O Не получается найти
     
  8. Chushkin

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

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Думаю, пропущена скобка. Д.б.:
    PHP:
    1. ...VALUES
    2. ('$IDColl', '$DescrColl', $CurDate, '$MainTextColl', '$AutorColl')")
     
    Qeuvec нравится это.
  9. Qeuvec

    Qeuvec Новичок

    С нами с:
    3 апр 2020
    Сообщения:
    10
    Симпатии:
    0
    Я СТОЛЬКО ЧАСОВ ПЯЛИЛСЯ В ЭТО И НЕ СМОГ УВИДЕТЬ
    Спасибо за то что потратил время на прочтение кода :rolleyes:
    Надо будет всё таки как нибудь да и впихнуть отладчик или что то вроде в visual code..