第一行的SQL语法错误 - 查询与工作的查询相同但是?

时间:2014-04-03 08:33:47

标签: php mysql sql

  

错误:您的SQL语法出错;查看与MySQL服务器版本对应的手册,以便在第1行'Order, Name, URL, UserName, Password, SiteName, Notes) VALUES ('','','','','','附近使用正确的语法

sql与工作插入查询完全相同;除了字段/表名。

以下是代码:

<?php
$con = mysqli_connect('HOST', 'USER', 'PASS','DATABASE');
if (!$con)
{
    die('Could not connect: ' . mysqli_error());
}
$sql="INSERT INTO RemoteLinks (Order, Name, URL, UserName, Password, SiteName, Notes) VALUES('$_POST[Order]','$_POST[Name]','$_POST[URL]','$_POST[UserName]','$_POST[Password]','$_POST[SiteName]','$_POST[Notes]')";

if (!mysqli_query($con,$sql))
{
    die('Error: ' . mysqli_error($con));
}

header('Location: ' . $_SERVER['HTTP_REFERER']);
mysqli_close($con);
?>

不太清楚为什么它不能在类似的查询中工作。感谢您的帮助,感谢它。

2 个答案:

答案 0 :(得分:6)

ORDER order by 子句中使用的保留字 - 带反引号的环绕声“`”

<强>更新

以下是 Reserved Words in MySQL 的列表。

您通常希望避免使用反引号来逃避这些保留字,因为反引号会降低代码的可移植性。因此,您可能需要学习这些内容并使用其他词来表示列名,表,数据库等。

重要

您一定要使用 mysqli_prepare() mysqli_stmt_bind_param()

答案 1 :(得分:1)

您需要使用返回刻度`来保留列名(Order)和准备SQL语句以执行并绑定参数以防止sql注入:

<?php

$mysqli = new mysqli("localhost", "my_user", "my_password", "my_database");

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

$insertQuery = 'INSERT INTO RemoteLinks (`Order`, Name, URL, UserName, Password, SiteName, Notes) '.
               'VALUES (?, ?, ?, ?, ?, ?, ?)';

if ($stmt = $mysqli->prepare($insertQuery))
{
    $stmt->bind_param(
        "sssssss",
            $_POST['Order'],
            $_POST['Name'],
            $_POST['URL'],
            $_POST['UserName'],
            $_POST['Password'],
            $_POST['SiteName'],
            $_POST['Notes']);

    $stmt->execute();
    $stmt->close();
}

$mysqli->close();

?>