将 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 时出现语法错误的主要内容,如果未能解决你的问题,请参考以下文章

将字符串转换为 int 时出现语法错误

将字符串转换为 int 时出现语法错误 [重复]

将 varchar 值“1.33”转换为数据类型 int 时出现问题

将 varchar 转换为 smallint 时出现转换错误

将 varchar 转换为数字数据类型时出现算术溢出错误。找不到存储过程''。?

将 varchar 值“AND ID =”转换为数据类型 int 时转换失败