我有这个将一些数据插入MySQLi数据库
<?php
$servername = "localhost";
$username = "XXXXX";
$password = "XXXXX";
$dbname = "XXXXX";
$url = "http://$_SERVER[HTTP_HOST]$_SERVER[REQUEST_URI]";
$ip_address = $_SERVER['REMOTE_ADDR'];
$last_url = $_SERVER['HTTP_REFERER'];
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
$sql = "INSERT INTO url_referer (url_referer, ip address, current_url) VALUES ('$last_url', '$ip_address', '$url')";
if ($conn->query($sql) === TRUE) {
echo " ";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
?>
我一直收到这个错误:
错误:INSERT INTO url_referer(url_referer,ip address,current_url)VALUES('','72 .69.102.254','http://bithumor.co/') 您的SQL语法有错误;检查与MySQL服务器版本对应的手册,以获得正确的语法 靠近'address,current_url)VALUES('','72 .69.102.254', “http://bithumor.co/”)'第1行
我该如何解决这个问题?
答案 0 :(得分:3)
如果您的列名确实包含空格ip address
,则需要将其包装在刻度线中,或者重命名您的列名称以包含下划线。
(url_referer, `ip address`, current_url)
或重命名
(url_referer, ip_address, current_url)
然后你不需要滴答声。
但是,如果它包含MySQL保留字或连字符,或者它会抱怨的任何其他内容,则需要滴答。
旁注:我注意到您的表和列都具有相同的名称url_referer
。确保事实确实如此。
另外,根据我的评论:
$_SERVER['HTTP_REFERER']
的旁注。它不可靠。 另一件事。如果仍然存在问题,那么您将需要转义数据。
即:
$last_url = $_SERVER['HTTP_REFERER'];
$last_url = mysqli_real_escape_string($conn, $last_url);
并将该逻辑应用于要插入表中的变量。
您目前的代码向SQL injection开放。使用prepared statements或PDO with prepared statements,他们更安全。
MySQLi编写的语句示例:
<?php
$link = new mysqli('xxx', 'xxx', 'xxx', 'xxx');
if ($link->connect_errno) {
throw new Exception($link->connect_error, $link->connect_errno);
}
// Check that the expected value has been provided via a POST request
if (!isset($_POST['input'])) {
throw new Exception('Missing POST request parameter [input]');
}
// now prepare an INSERT statement
if (!$stmt = $link->prepare('INSERT INTO `table` (`column_x`) VALUES (?)')) {
throw new Exception($link->error, $link->errno);
}
// bind parameters
$stmt->bind_param('s', $_POST['input']);
if (!$stmt->execute()) {
throw new Exception($stmt->error, $stmt->errno);
}
将error reporting添加到文件的顶部,这有助于查找错误。
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
// rest of your code
旁注:错误报告应仅在暂存时完成,而不是生产。
答案 1 :(得分:0)
您在ip_address
$sql = "INSERT INTO url_referer (url_referer, ip address, current_url) VALUES ('$last_url', '$ip_address', '$url')";
应该是:
$sql = "INSERT INTO url_referer (url_referer, ip_address, current_url) VALUES ('$last_url', '$ip_address', '$url')";
如果列名真的是ip address
,请执行@Fred-ii
所说的内容。如下所示
(url_referer, `ip address`, current_url)