错误插入mysqli数据库

时间:2015-06-04 16:56:39

标签: php mysqli

我有这个将一些数据插入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行

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

如果您的列名确实包含空格ip address,则需要将其包装在刻度线中,或者重命名您的列名称以包含下划线。

(url_referer, `ip address`, current_url)

或重命名

(url_referer, ip_address, current_url)

然后你不需要滴答声。

但是,如果它包含MySQL保留字或连字符,或者它会抱怨的任何其他内容,则需要滴答。

旁注:我注意到您的表和列都具有相同的名称url_referer。确保事实确实如此。

另外,根据我的评论:

另一件事。如果仍然存在问题,那么您将需要转义数据。

即:

$last_url = $_SERVER['HTTP_REFERER'];
$last_url = mysqli_real_escape_string($conn, $last_url);

并将该逻辑应用于要插入表中的变量。

您目前的代码向SQL injection开放。使用prepared statementsPDO 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)