首页 > 解决方案 > 此 select 语句中的语法错误在哪里?

问题描述

我在一个令我困惑的 sql insert 语句中返回了一个语法错误。插入实际上发生了,但错误正在停止其余的过程。

服务器运行 PHP 5.6.35,我使用的是 mysqli 5.5.59。我还有其他以类似方式编写的插入按预期工作。

服务器端:

<?php
    $db = mysqli_connect('localhost', '******', '******', '******'); //Starred out for posting here

    $charName = $_POST['charName'];
    $metatype = $_POST['metatype'];
    $user_id = $_POST['user_id'];

    $sqlStatement = sprintf("insert into characters (name, metatype, user_id) values('%s','%s',%s);",
        mysqli_real_escape_string($db, $charName),
        mysqli_real_escape_string($db, $metatype),
        mysqli_real_escape_string($db, $user_id));

    echo $sqlStatement;

    $result = mysqli_query($db, $sqlStatement);

    if($result == false)
    {
        echo 'Error Inserting to Database: '.mysqli_error($db);
        http_response_code(500);
        return;
    }
    else
    {
        //Not getting here, more core that should run if no error
    }
?>

随着代码回显 sql 字符串,我得到:

insert into characters (name, metatype, user_id) values('Test 45','human',5);

其次是:

插入数据库时​​出错:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ')' 附近使用正确的语法

返回字符列表,新字符被包括在内。

在数据库列上,name 和 metatype 是 utf8 文本类型,而 user_id 是整数。

关于重复标志:

我看不出这是链接问题的副本。我正在使用不同的方法来创建语句,并且我的语句实际上在除 mysqli 之外的所有内容中都没有错误地运行(它在技术上仍然运行)。给出的答案是一样的:“只使用准备好的语句”,实际上并没有回答问题。我知道它们是优越的,但据我所知,我使用的方法在 php 中没有被弃用,并且应该仍然有效。

更新:

切换到准备好的语句也会产生此错误。代码:

$db = new mysqli('localhost', '******', '******', '******');

$charName = $_POST['charName'];
$metatype = $_POST['metatype'];
$user_id = $_POST['user_id'];

$sqlStatement = $db->prepare("insert into `characters` (`name`, `metatype`, `user_id`) values(?,?,?)");
$sqlStatement->bind_param("ssi", $charName, $metatype, $user_id);

$result = $sqlStatement->execute();

if($result == false)
{
    echo 'Error Inserting to Database: '.mysqli_error($db);
    http_response_code(500);
    return;
}

回复:

插入数据库时​​出错:您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 ')' 附近使用正确的语法

标签: phpmysqli

解决方案


您应该开始使用准备好的语句,而不是使用sprintf和转义分开。此外,您的查询中可能有保留字,例如name- 尝试在列名周围使用反引号以避免任何混淆。查询可能如下所示:

insert into `characters` (`name`, `metatype`, `user_id`) values('Test 45','human',5);

最后,您的问题可能与 PHP 或 MySQLi 无关——首先尝试在 MySQL shell 中运行查询以检查它是否有效


推荐阅读