Какой запрос SQL нужно использовать, чтобы добавить запись в базу данных?

Добрый день, коллеги. У меня есть работающий запрос на добавление записи в базу данных, который перестал функционировать после увеличения количества переменных. Вот сам запрос:

```php
$name = $_POST['name'];
$content = $_POST['content'];
$price = ['price'];
$sale = ['sale'];
$thumb = $_POST['Thumbnail'];
$smallContent = $_POST['smallContent'];

$query = "INSERT INTO `orders` (`name`, `content`, `price`, `sale`, `image`, `smallContent`) VALUES ('$name', '$content', '$price', '$sale', '$thumb', '$smallContent')";
mysqli_query($link, $query) or die(mysqli_error($link));

if(!$query) {
	echo "<h1 style='text-align: center'>Ошибка добавления товара</h1>";
} else {
	echo "<h1 style='text-align: center'>Товар добавлен</h1>";
}
```

Однако я получаю следующее сообщение об ошибке: "Warning: Array to string conversion in C:\Users\users\Desktop\xamp\htdocs\public_html\admin\create-order.php on line 74". Может ли увеличение числа переменных быть причиной этого предупреждения?
  • 10 апреля 2025 г. 15:15
Ответы на вопрос 2
Да, ваше предупреждение связано с тем, что вы пытаетесь вставить массив в базу данных. В текущем коде переменные `$price` и `$sale` не присваиваются значением из POST-запроса. Вместо этого вы создаете массивы (с использованием квадратных скобок), что и приводит к ошибке "Array to string conversion", так как SQL не может работать с массивами.

Вам нужно присвоить значения переменным `$price` и `$sale` из `$_POST`, аналогично тому, как это сделано с остальными переменными. Вот исправленный код:

```php
$name = $_POST['name'];
$content = $_POST['content'];
$price = $_POST['price'];  // Предполагая, что вы отправляете 'price' через POST
$sale = $_POST['sale'];    // Предполагая, что вы отправляете 'sale' через POST
$thumb = $_POST['Thumbnail'];
$smallContent = $_POST['smallContent'];

$query = "INSERT INTO `orders` (`name`, `content`, `price`, `sale`, `image`, `smallContent`) VALUES ('$name', '$content', '$price', '$sale', '$thumb', '$smallContent')";
if (mysqli_query($link, $query)) {
    echo "<h1 style='text-align: center'>Товар добавлен</h1>";
} else {
    echo "<h1 style='text-align: center'>Ошибка добавления товара: " . mysqli_error($link) . "</h1>";
}
```

Также, важно помнить о безопасности: использование переменных напрямую в запросах SQL может привести к SQL-инъекциям. Для защиты от этого рекомендуется использовать подготовленные выражения (prepared statements). Вот пример:

```php
$stmt = $link->prepare("INSERT INTO `orders` (`name`, `content`, `price`, `sale`, `image`, `smallContent`) VALUES (?, ?, ?, ?, ?, ?)");
$stmt->bind_param("ssssss", $name, $content, $price, $sale, $thumb, $smallContent);

if ($stmt->execute()) {
    echo "<h1 style='text-align: center'>Товар добавлен</h1>";
} else {
    echo "<h1 style='text-align: center'>Ошибка добавления товара: " . $stmt->error . "</h1>";
}

$stmt->close();
```

Используйте этот подход, чтобы сделать вашу базу данных более безопасной и избежать возможных уязвимостей.
кажется, вместо 
$price = ['price'];
$sale = ['sale'];

надо бы
$price = $_POST['price'];
$sale = $_POST['sale'];


а сам запрос переделать хотя бы на prepared statements https://www.php.net/manual/en/mysqli.quickstart.pr... чтобы не создавать уязвимости на пустом месте

заодно почитать про xss и про https://www.php.net/manual/en/function.strip-tags.php если потом этот контент выводится напрямую
Похожие вопросы