如何以程序方式绑定参数
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_result 或 mysqli_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);
以上是关于如何以程序方式绑定参数的主要内容,如果未能解决你的问题,请参考以下文章
[Spring MVC] - SpringMVC的各种参数绑定方式