У меня есть очень простой код для вставки данных в базу данных, а также проверяет, если уже есть одни и те же данные в таблицепеременная не вставлена в таблицу
[HTML]
<html>
<head>
<title>nickname</title>
</head>
<body>
<p>input nickname</p>
<form action="foo.php" method="post">
<input type="text" name="nickname" />
<input type="submit">
</form>
</body>
</html>
[PHP]
//foo.php
if(isset($_POST['nickname']) && !empty($_POST['nickname'])) {
$nickname = $_POST['nickname'];
//Object Oriented way
$servername = "localhost";
$username = "root";
$password = "foo_bar";
$dbname = "nickname";
//check connection
$conn = new mysqli($servername, $username, $password, $dbname);
if($conn->connect_error) {
die("cannot connect:".$conn->connect_error);
}
$sql = "SELECT * FROM nickname WHERE nickname='$nickname'";
$result = $conn->query($sql);
if($result->num_rows > 0) {
echo "nickname exists!";
} else {
$sql = "INSERT INTO nickname(nickname) VALUES(".$nickname.")";
$conn->query($sql);
echo "welcome $nickname!";
}
$conn->close();
} else {
echo "please input your nickname";
}
Я все еще изучаю, как использовать MySQL, что я делаю неправильно? особенно эта линия
$sql = "INSERT INTO nickname(nickname) VALUES(".$nickname.")";
$conn->query($sql);
данные в переменной не вставлена в таблицу, ничего не происходит. , но если я заменю $nickname
на обычный текст, данные будут вставлены.
Почему это дубликат? речь идет даже не о «как предотвратить SQL инъекции»
Вашего сценария находится под угрозой [SQL Injection Attack] (http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) Посмотрите, что случилось с [Little Bobby Tables] (http://bobby-tables.com/) Даже [если вы (http://stackoverflow.com/questions/5741187/sql-injection-that-gets-around-mysql-real-escape-string) Используйте [подготовленные параметризованные утверждения] (http:// /php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly
@RiggsFolly спасибо за ответ, да, я должен использовать подготовленные заявления, но разве это решает проблему? Я написал простой сценарий, чтобы просто проверить ... –
@ha_ryu совершенно противоположное, подготовленное заявление - это самое и единственное решение этой проблемы. Это означает, что дублирующее соединение фактически неверно. –