【问题标题】:MSSQL php pdo pagination, some thing wrong on bindParamMSSQL php pdo分页,bindParam有些问题
【发布时间】:2016-07-25 04:26:16
【问题描述】:

MsSQL 工作正常:

$ppage = 15;
$poset = 0;
$stmt = "SELECT * FROM tbl ORDER BY ID OFFSET {:$poset } ROWS FETCH NEXT {:ppage } ROWS ONLY";
$stmt = $this->conn->prepare($stmt);
$stmt->execute();
return $row = $stmt->fetchAll();

MsSQL 无法正常工作:

$ppage = 15;
$poset = 0;
$stmt = "SELECT * FROM tbl ORDER BY ID OFFSET :poffset ROWS FETCH NEXT :perpage ROWS ONLY";
$stmt = $this->conn->prepare($stmt);
$stmt->bindParam(':poffset', $poset);
$stmt->bindParam(':perpage', $ppage);
$stmt->execute();
return $row = $stmt->fetchAll();

查询很好,我使用变量运行实际数据它可以工作,但是当我通过bindParam 设置变量时它不起作用,我什么时候失踪了。

提前致谢。

【问题讨论】:

    标签: php sql-server pdo


    【解决方案1】:

    尝试改用bindValue

    $stmt = $this->conn->prepare($stmt);
    $stmt->bindValue(':poffset', $poset, PDO::PARAM_INT);
    $stmt->bindValue(':perpage', $ppage, PDO::PARAM_INT);
    $stmt->execute();
    

    【讨论】:

    • 它现在可以工作了,BindValue 和 bindParam 之间的安全性有什么区别吗?
    • @Rafiq 我不知道安全性有什么不同。您仍然受到 SQL 注入的保护。
    • 对两个分析器都做了 :)
    【解决方案2】:

    不使用bindParam() 函数,而是在execute() 函数的参数内添加一个包含值的数组。

    类似这样的:

    $stmt = $this->conn->prepare($stmt);
    $stmt->execute(array(':poffset' => $poset, ':perpage' => $ppage)); // using an array rather than the bindValue function.
    

    像往常一样使用 bindParam 函数,但用逗号代替 =>

    这种做事方式将使您不必为每个值调用bindParam() 函数&仍然可以防止SQL 注入。

    【讨论】:

    • 如果这对您有帮助或解决了您的问题,请考虑投票或选择作为答案。 :) @Rafiq
    猜你喜欢
    • 1970-01-01
    • 2012-11-04
    • 1970-01-01
    • 2015-03-14
    • 2014-08-11
    • 2012-05-03
    • 1970-01-01
    • 2016-04-14
    • 1970-01-01
    相关资源
    最近更新 更多