php - 此 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 行的 ')' 附近使用正确的语法
解决方案
您应该开始使用准备好的语句,而不是使用sprintf
和转义分开。此外,您的查询中可能有保留字,例如name
- 尝试在列名周围使用反引号以避免任何混淆。查询可能如下所示:
insert into `characters` (`name`, `metatype`, `user_id`) values('Test 45','human',5);
最后,您的问题可能与 PHP 或 MySQLi 无关——首先尝试在 MySQL shell 中运行查询以检查它是否有效
推荐阅读
- java - 通过 id 而不是位置选择微调器
- javascript - 带有ajax形式的jquery 3.1.0
- python - 在 Pandas 中将 csv 转换为 txt 时,电话号码中丢失“+”
- c++ - 不带星号的函数指针参数
- angular - 如何将字节数组转换为角度 6 中的图像?
- swift - 不支持的 Swift 版本 Xcode 10.2.1
- sql-server - 使用 TRANSLATE 函数从文本中删除字符(用空字符串替换它们)
- powershell - Powershell搜索.exe文件
- ruby-on-rails - 如何在 Rails 中创建脚本并使用控制台运行它
- dataframe - 从spark保存数据帧时,如何避免具有空值的行覆盖phoenix中的现有行?