#php #mysql #mysqli
#php #mysql #mysqli
Вопрос:
Я провел последние 2 дня, пытаясь создать форму для ввода данных в базу данных SQL. База данных функциональна, таблицы созданы, и я могу вводить данные через MYSQL. Я использую 2 файла bidinput.html
и bidentry.php
Bidinput.HTML:
<html>
<body>
<form action="bidentry.php" method="post">
Bidder: <input type="text" name="BidderNumber"><br>
Description: <input type="text" name="Description"><br>
Price: <input type="decimal" name="Price"><br>
Quantity: <input type="integer" name="Quantity"><br>
Lot: <input type="text" name="Lot"><br>
<input type ="submit">
</form>
</body>
</html>
bidentry.php:
<?php
######### From bidinput.html
$BidderNumber = $_POST['BidderNumber'];
$Description = $_POST['Description'];
$Price = $_POST['Price'];
$Quantity = $_POST['Quantity'];
$Lot = $_POST['Lot'];
########
$dbhost = "localhost";
$dbuser = "root";
$dbpass = "abcd1234";
$dbname = "auction";
// Create connection
$mysqli = new mysqli($dbhost,$dbuser,$dbpass,$dbname);
// Check connection
if ($mysqli->connect_errno){
echo "Failed to connect to MySQL: " . $mysqli->connect_error;
}
else{
echo "Connected successfully";
$sql = "INSERT INTO Bids (BidderNumber,Description,Price,Quantity,Lot) VALUES ('$BidderNumber','$Description','$Price','$Quantity','$Lot')";
echo "Error: " . $sql . "<br>" . $mysqli->error;
}$mysqli->close();
?>
Когда я запускаю, нажимаю кнопку отправки, я получаю следующую ошибку:
Подключено успешно Ошибка: ВСТАВКА В ЗНАЧЕНИЯ Bids (BidderNumber, Description, Price,Quantity, Lot) (‘202′,’candy’,’3′,’1′,»)
Комментарии:
1. Вы не получаете сообщение об ошибке. Вы выводите запрос, даже не выполняя его. Вы должны использовать подготовленный оператор.
Ответ №1:
ПРЕДУПРЕЖДЕНИЕ Вам необходимо защитить себя от SQL-инъекций. Вы должны использовать подготовленные инструкции, чтобы защитить себя от SQL-инъекций.
На самом деле вы не выполняете никаких запросов с вашим текущим кодом.
Вам нужно использовать запрос mysqli:
$mysqli->query($sql);
Подготовленный пример инструкции
Вот пример ВСТАВКИ с подготовленными операторами на основе вашего кода:
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli($dbhost,$dbuser,$dbpass,$dbname);
$stmt = $mysqli->prepare("INSERT INTO Bids (BidderNumber, Description, Price, Quantity, Lot) VALUES (?,?,?,?,?)");
$stmt->bind_param("sssss", $_POST['BidderNumber'], $_POST['Description'], $_POST['Price'], $_POST['Quantity'], $_POST['Lot']);
$stmt->execute();
$stmt->close();
Редактировать: поместите это в начало вашего PHP-файла:
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
Вы не хотите отображать ошибки в рабочей среде, но в среде разработки это нормально.
Возможно, вы захотите проверить свой PHP.INI-файл. По крайней мере log_errors
, должно быть включено по умолчанию, и ошибки будут регистрироваться в вашем журнале ошибок apache.
Комментарии:
1. Я все еще получаю белый экран, журнал apache2 не показывает ошибок. есть ли какой-то отладочный скрипт, который я могу запустить?
2. Попадают ли данные в таблицу?
3. Сейчас это работает. Я перезагрузил SQL-сервер, и внезапно он заработал. Большое вам спасибо за вашу помощь.
4. Итак, давайте посмотрим, правильно ли я это понимаю. Подготовленный оператор в основном состоит из 4 частей …. 1. Подготовить. здесь я определяю столбцы, в которые я хочу вставить данные. 2. Привязка с помощью $POST[ ] это идентифицирует данные, которые должны быть введены в столбцы, определенные в строке подготовки. 3. Выполнить и 4. Закрыть. Без закрытой строки я все еще был бы подвержен sql-инъекции?
5. Очевидно, я использую старую справочную версию PHP amp; MYSQL для чайников 3rd edition. Он не ссылается на подготовленные операторы. Есть ли ссылка, которую вы бы порекомендовали?