【问题标题】:syntax error in converting varchar into int将 varchar 转换为 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 进行模块化,所有其他答案也很好。

标签: php


【解决方案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";
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-09-15
            • 2016-09-08
            • 1970-01-01
            • 2017-07-16
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多