У меня есть веб-сайт, который позволяет мне получить IP-адрес, пользовательский агент и имя хоста клиентского устройства. Я установил его для сохранения в базе данных MySQL, но когда я смотрю в phpmyadmin, он не появляется.
Вот мой код:
<?php
$servername = "localhost";
$username = "[USERNAME GOES HERE - OBSCURED TO PROTECT]";
$password = "[PASSWORD GOES HERE - OBSCURED TO PROTECT]";
$dbname = "[DBNAME GOES HERE - OBSCURED TO PROTECT]";
// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);$ip = $_SERVER['REMOTE_ADDR'];
$user = $_SERVER['HTTP_USER_AGENT'];
$host = gethostbyaddr($_SERVER['REMOTE_ADDR']);;
$sql = mysqli_query($conn, "INSERT INTO data (ipaddress, useragent, hostname)
VALUES ($ip, $user, $host)");
?>
<!DOCTYPE html>
<html>
<head>
<title>IP Address</title>
<style>
body {
margin: 0;
}
</style>
</head>
<body>
<h1>IP address recorded!</h1>
</body>
<?php
mysqli_close();
?>
Есть идеи?
Вы уязвимы для SQL инъекций, и множественные ошибки синтаксиса SQL — ни одно из ваших значений данных не заключено в кавычки, поэтому вы вставляете текст BARE в запрос.
$sql = [..snip..] "... VALUES ('$ip', '$user', '$host')") or die(mysqli_error($conn));
^---^--^-----^--^-----^ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Обратите внимание на кавычки и или или умереть (). Если у вас были кавычки, запрос МОЖЕТ работать. И если бы вы имели or die
вам сказали бы, ПОЧЕМУ ваш запрос потерпел неудачу.
Поскольку я предполагаю, что ваши поля имеют тип char или varchar, вам нужно заключить в одну кавычку каждую переменную
$ip = mysqli_real_escape_string($conn, $_SERVER['REMOTE_ADDR']);
$user = mysqli_real_escape_string($conn, $_SERVER['HTTP_USER_AGENT']);
$host = gethostbyaddr($ip);
$sql = mysqli_query($conn, "INSERT INTO data (ipaddress, useragent, hostname)
VALUES ('$ip', '$user', '$host')");