0

При выполнении скрипта получаю ошибку, думаю что ошибка в этой строке кода. Данные скрипт получает с отсылаемой формы и выдает ошибку, скорее всего неправильно записал, помогите найти ошибку.

$sql = "INSERT INTO Data (Name, Description,Photo,Buy,Sell) VALUES ('"$_POST['name']"','"$_POST['description']"','"$_POST['photo']"','"$_POST['buy']"','"$_POST['sell']"'"));
Andrii
  • 97
  • Ошибка секретная какая-то, да? – u_mulder Mar 11 '19 at 20:49
  • HTTP ERROR 500 Ошибка – Andrii Mar 11 '19 at 20:51
  • На кавычки внимание обратите. И код надо писать в редакторе с подсветкой синтаксиса. – u_mulder Mar 11 '19 at 20:54
  • В редакторе все нормально , но почему то не работает – Andrii Mar 11 '19 at 21:05
  • Когда у вас 500 ошибка то в логах веб сервера есть все подробности. А вообще никогда так не пишите. Используйте подготавливаемые выражения и привязку переменных. Тогда никаких проблем с кавычками возникать не будет, так как не будет ни каких кавычек. Кроме того вас тогда не взломают через 5 минут после того как этот код окажется в интернете. См. примеры тут http://php.net/manual/ru/mysqli-stmt.bind-param.php – Mike Mar 11 '19 at 21:05
  • Если редактор блокнот - то да, в нем все нормально. – u_mulder Mar 11 '19 at 21:06
  • Самое удивительное, что в вашем коде нет ни одной точки. А конкатенация строк в php это оператор .. Нельзя в php взять и написать print "hellow " "world" и ожидать, что не будет синтаксической ошибки – Mike Mar 11 '19 at 21:11

1 Answers1

2

Запросы в базу данных следует выполнять с помощью подготовленных выражений. Для этого лучше всего использовать класс PDO.

Выполнение запросов на вставку с помощью подготовленных выражений происходит в 2 стадии:

  • подготовка запроса, при этом на место всех переменных ставятся знаки вопроса. При этом создается переменная $stmt.
  • выполнение запроса, при котором все участвующие в запросе переменные отправляются отдельно, в виде массива, в метод $stmt->execute().

в итоге код получается аккуратным и безопасным:

$sql = "INSERT INTO Data (Name, Description,Photo,Buy,Sell) VALUES (?,?,?,?,?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$_POST['name'], $_POST['description'], $_POST['photo'], $_POST['buy'],$_POST['sell']]);

Также можно посмотреть другие примеры запросов с использованием подготовленных выражений

Хочу отметить, что данный подход гарантирует нас от ошибок синтаксиса. Однако при выполнении запроса могут возникать и другие ошибки. Это совершенно нормальная ситуация, и в случае возникновения ошибки надо просто прочитать её текст ,понять в чем она заключается, и исправить.

Чтобы ПДО всегда сообщал об ошибких, надо писать код соединения так, как написано в этом ответе