如何以程序方式绑定参数

Posted

技术标签:

【中文标题】如何以程序方式绑定参数【英文标题】:How to bind parameters in a procedural way 【发布时间】:2016-03-27 09:58:11 【问题描述】:

我和我的团队正在尝试根据在 php 中对 PDO 所做的操作以程序方式绑定参数,但是当我们这样做时,我们得到了以下错误:

警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,给定对象

我们想要转换为程序的原始 PDO 工作代码是:

    $last_id = $_POST['last_id'];
$limit = 5; // default value
if (isset($_POST['limit'])) 
    $limit = intval($_POST['limit']);


try 
        $sql = 'SELECT * FROM items WHERE id > :last_id ORDER BY id ASC LIMIT 0, :limit';
        $query = $pdo->prepare($sql);
        $query->bindParam(':last_id', $last_id, PDO::PARAM_INT);
        $query->bindParam(':limit', $limit, PDO::PARAM_INT);
        $query->execute();
        $list = $query->fetchAll();
     catch (PDOException $e) 
        echo 'PDOException : '.  $e->getMessage();
    

这是我们将其转化为程序的做法:

$last_id = $_POST['last_id'];
$limit = 5; // default value
if (isset($_POST['limit'])) 
    $limit = intval($_POST['limit']);



 $stmt = mysqli_prepare($connection, "SELECT id, photo, title, description FROM items WHERE id > ?  ORDER BY id ASC LIMIT 0, ?") or die(mysqli_error($connection));

    /* bind parameters for markers */
    mysqli_stmt_bind_param($stmt, 'ii', $last_id, $limit) or die(mysqli_error($connection));



    /* execute query */
    mysqli_stmt_execute($stmt) or die(mysqli_error($connection));

    /* bind result variables */
    mysqli_stmt_bind_result($stmt, $col1, $col2,$col3, $col4) or die(mysqli_error($connection));

########################################





$last_id = 0;


while( $rs = mysqli_fetch_assoc($stmt)) 

    $last_id = $rs['id'];
    echo '<li>';
    echo '<h2>'.$rs['title'].'</h2>';
    echo '<img src="'.$rs['photo'].'">';
    echo '<p>'.$rs['description'].'</p>';
    echo '</li>';




if ($last_id != 0) 
    echo '<script type="text/javascript">var last_id = '.$last_id.';</script>';

问题 使用我们的程序方法,我们不断收到以下错误消息:

警告:mysqli_fetch_assoc() 期望参数 1 为 mysqli_result,给定对象

在search 之后,我们无法真正分辨出我们在 mysqli_stmt_bind_resultmysqli_fetch_assoc()

中的错误位置

问题: 请问?

【问题讨论】:

你必须使用 SELET col1,col2 而不是 select * 并且在 mysqli_stmt_bind_result($stmt, $col1, $col2)$last_id, $limit 也是 int 所以使用 mysqli_stmt_bind_param($stmt, 'ii' mysqli_stmt_bind_result($stmt, $last_id, $limit) 更改为mysqli_stmt_bind_result($stmt, $col1, $col2,$col3, $col4) @Saty 我刚刚做了,现在它抛出另一个错误 mysqli_fetch_assoc() 期望参数 1 是 mysqli_result,给定对象 使用while (mysqli_stmt_fetch($stmt)) printf("%s %s\n", $col1, $col2); @Saty Cool。有效。现在您能否解释最后一部分并将其作为答案发布,以便我验证它。请解释我如何像包含标题的变量一样拼命地使用每个变量,分别形成其他变量并将其添加为答案。谢谢 【参考方案1】:

根据本文档mysqli_stmt_bind_result

您需要将查询更改为SELECT col1,col2..... 而不是select *

mysqli_stmt_bind_param($stmt, 'ii', $last_id, $limit) or die(mysqli_error($connection));// here use int because `$last_id, $limit` are integer
    /* execute query */
    mysqli_stmt_execute($stmt) or die(mysqli_error($connection));
    /* bind result variables */
    mysqli_stmt_bind_result($stmt, $col1, $col2,$col3, $col4) or die(mysqli_error($connection));

获取数据使用

 /* fetch values */

 while (mysqli_stmt_fetch($stmt)) 
        printf("%s %s\n", $col1, $col2);
    

【讨论】:

你能解释一下printf("%s %s\n", $col1, $col2);吗?假设我只想将例如来自数据库的标题显示为列名“标题”,我该怎么办?谢谢 $col1是第一列值形式选择查询SELECT col1等等。 或者你可以使用SELECT id, photo, title, description FROM...mysqli_stmt_bind_result($stmt, $id, $photo,$title, $description)while (mysqli_stmt_fetch($stmt)) printf("%s %s\n", $id, $photo,$title, $description);

以上是关于如何以程序方式绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

GIN下关于参数的多次绑定问题

[Spring MVC] - SpringMVC的各种参数绑定方式

23SpringMvc_各种参数绑定方式-就是<input那种

js如何清除所有绑定的事件?

如何在eolinker做参数绑定

纹理绑定的特殊参数?