【问题标题】:PHP Limit with session var sql errorPHP限制会话var sql错误
【发布时间】:2017-05-27 15:58:32
【问题描述】:

我的问题是得到这个错误:

SQLSTATE[42000]:语法错误或访问冲突:1064 您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“1”附近使用正确的语法

这段代码给了我错误:

public function toonAlles()
{
    try {
        if (isset($_SESSION["limiet"])) {
            $limitwaarde = $_SESSION["limiet"];
            echo $limitwaarde;
            var_dump($limitwaarde);
            $sql = "SELECT * FROM lottogamedata LIMIT :limietwaarde";
            $smt = $this->db->prepare($sql);
            $smt->bindParam("limietwaarde", $limitwaarde, PDO::PARAM_INT);

        }
        else{
            $sql = "SELECT * FROM lottogamedata";
            $smt = $this->db->prepare($sql);
        }

        $smt->execute();
        $lottotabel = $smt->fetchAll(PDO::FETCH_OBJ);

    } catch (PDOException $e) {
        die($e->getMessage());
    }

    return $lottotabel;
}

这是初始化会话的地方:

session_start();
$Winkel = Winkel::getEuroInstantie();
Uitvoer::toonKeuzeMenu();
Uitvoer::extraFunctions();
if (isset($_POST["submitTheSpecifyRequest"])){
    helper::voegToegAanDeSessie($_POST["maxNumbers"]);

}

这是 submitTheSpecifyRequest 按钮:

public static function extraFunctions(){
    ?>
      <form class="form-group" method="post" id="extraOpties">
          <label for="maxNumbers">Limit the results by</label>
          <input name="maxNumbers" class="form-control" id="maxNumbers" type="number" required min="1" value="1">
          <input type="submit" value="Specify your search" class="btn btn-primary" name="submitTheSpecifyRequest" id="submitTheSpecifyRequest"/>
      </form>
    <?php
}

提前感谢我帮助我!

【问题讨论】:

  • 如果我尝试这样做会给我一个致命错误:无法在第 49 行通过引用传递参数 2
  • 试试$smt-&gt;bindParam(":limietwaarde", ...limietwaarde前面有冒号)see docs
  • @Steven 是的,其中一位 cmets 也是这么说的。试试$limitwaarde = (int)$_SESSION["limiet"];
  • @rickdenhaan 谢谢它的工作!

标签: php mysql syntax-error session-variables


【解决方案1】:

PDO 的bindParam 有一个错误,如果您尝试将字符串与PDO::PARAM_INT 绑定,它实际上仍会将其绑定为字符串(带引号)。您需要自己将值转换为 int:

请注意,您不能在对bindParam 本身的调用中将其转换为 int,因为它需要引用。通过在函数调用中进行内联转换,您将没有可以引用的变量,因此您必须事先将其转换为变量。

// won't work:
$limitwaarde = $_SESSION["limiet"];
$smt->bindParam("limietwaarde", (int)$limitwaarde, PDO::PARAM_INT);

// will work:
$limitwaarde = (int)$_SESSION["limiet"];
$smt->bindParam("limietwaarde", $limitwaarde, PDO::PARAM_INT);

【讨论】:

    【解决方案2】:

    $limitwaarde 好像不是 int,会话存储的变量可能存储为字符串

    尝试:

    $smt->bindParam(":limietwaarde", intval($limitwaarde), PDO::PARAM_INT);
    

    【讨论】:

    • 如果 var_dump($limietwaarde) 这样做是结果: :string '1' (length=1) 是不是他们要转换它?饼干可能更好吗?
    • 不,但是你输入了 : PDO::PARAM_INT 所以它需要一个 int
    • 会话或cookies,这取决于你的需要
    • 如果我使用这个 $sql = "SELECT * FROM lottogamedata LIMIT ".$limitwaarde;而不是 $sql = "SELECT * FROM lottogamedata LIMIT :limitwaarde";使用 bindParam 可以吗?为什么它不能与 bindPara 一起使用?
    • 我认为它不起作用,因为您正在使用 PDO::PARAM_INT 并将字符串传递给 bindParam 函数,您必须解析存储在会话中的字符串才能使用它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多