将 varchar 转换为 int 时出现语法错误
Posted
技术标签:
【中文标题】将 varchar 转换为 int 时出现语法错误【英文标题】:syntax error in converting varchar into int 【发布时间】:2016-10-30 06:52:21 【问题描述】:我收到了这个错误
Error: You have an error in your SQL syntax; check the manual that corresponds to your mysql server version for the right syntax to use near '(int) , (int)' at line 2
我在SO上跟进了这个答案
我将 base 和 limit 作为字符串,我想将它们转换为 int。这是我的代码
$category = $_POST['category'];
$base= $_POST['base'];
$limit= $_POST['limit'];
$sql = "SELECT id, name, url
FROM OBJECTS where CATEGORY='$category' limit (int)$base , (int)$limit";
【问题讨论】:
php 不会在带引号的字符串中插入它,你应该这样做(int)$base
带括号,或 ".(int)$base."
正如其他人所说,您正在尝试在 mySQL 语句中使用 PHP 转换方法。 mySQL 不明白这一点。要么先在 PHP 中强制转换,然后将其放入 SQL 语句中,要么使用 mySQL 的强制转换运算符。
@ArtisiticPhoenix (int)$base
将不起作用,因为
必须跟在 $
之后,以便 PHP 将变量放在那里。
@Justinas - 你可能是对的,不过我走在正确的轨道上。我会更新我的答案。顺便说一句,谢谢,我记得你现在提到它。
我喜欢在 SQL 语句中编写代码,因为它允许我使用 POST 进行模块化,所有其他答案也很好。
【参考方案1】:
你需要投射它。您现在正在做的是 PHP 转换。您必须在 SQL 语句中强制转换它。
$category = $_POST['category'];
$base= $_POST['base'];
$limit= $_POST['limit'];
$sql = "SELECT id, name, url
FROM OBJECTS where CATEGORY='$category' limit CAST($base AS UNSIGNED) , CAST($limit AS UNSIGNED)";
【讨论】:
【参考方案2】:PHP 变量插值不会在字符串中填充。
你需要这样做
$sql = "SELECT id, name, url FROM OBJECTS where CATEGORY='$category' limit ".(int)$base." , ".(int)$limit;
插值仅适用于变量(或以 $ 开头的东西),例如访问类(在变量中)所以像这样的东西
echo "self::$STATIC";
将寻找$STATIC
作为变量。本质上,如果 $v = 1
"(int)$v" becomes "(int)1"
随后,MySql 将(int)1
视为一个字符串并炸毁。
【讨论】:
【参考方案3】:像这样使用强制转换,
$category = $_POST['category'];
$base= intval($_POST['base']);
$limit= intval($_POST['limit']);
//OR
/*
$base= (int)($_POST['base'];
$limit= (int)($_POST['limit'];
*/
$sql = "SELECT `id`, `name`, `url`
FROM `OBJECTS` where CATEGORY='$category' limit $base ,$limit";
【讨论】:
【参考方案4】:MySql 没有 PHP 方式的类型转换。所以(int)$base
是错误的语法。
第一个类型转换,而不是查询的地方:
$base = intval($base);
$limit = intval($limit);
$sql = "SELECT id, name, url FROM OBJECTS where CATEGORY = '$category' limit $base, $limit";
考虑使用准备好的语句,而不是直接放置变量来查询而不是转义它们。
【讨论】:
【参考方案5】:在 php 中使用 intval...ref.link http://php.net/manual/en/function.intval.php
$category = $_POST['category'];
$base= intval($_POST['base']);
$limit= intval($_POST['limit']);
$sql = "SELECT id, name, url
FROM OBJECTS where CATEGORY='$category' limit $base , $limit";
【讨论】:
以上是关于将 varchar 转换为 int 时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章
将 varchar 值“1.33”转换为数据类型 int 时出现问题
将 varchar 转换为 smallint 时出现转换错误