我想看一个示例,该示例如何使用bind_result
vs.进行调用,get_result
以及一个使用另一个的目的是什么。
也是使用每种方法的利弊。
使用这两种方法的局限性是什么?
我想看一个示例,该示例如何使用bind_result
vs.进行调用,get_result
以及一个使用另一个的目的是什么。
也是使用每种方法的利弊。
使用这两种方法的局限性是什么?
Answers:
对我来说,决定性因素是我是否使用调用查询列*
。
bind_result()
为此,使用会更好:// Use bind_result() with fetch()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
get_result()
为此,使用会更好:// Use get_result() with fetch_assoc()
$query2 = 'SELECT * FROM table WHERE id = ?';
$query1
使用bind_result()
$query1 = 'SELECT id, first_name, last_name, username FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Store the result (to get properties) */
$stmt->store_result();
/* Get the number of rows */
$num_of_rows = $stmt->num_rows;
/* Bind the result to variables */
$stmt->bind_result($id, $first_name, $last_name, $username);
while ($stmt->fetch()) {
echo 'ID: '.$id.'<br>';
echo 'First Name: '.$first_name.'<br>';
echo 'Last Name: '.$last_name.'<br>';
echo 'Username: '.$username.'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
$query2
使用get_result()
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Get the result */
$result = $stmt->get_result();
/* Get the number of rows */
$num_of_rows = $result->num_rows;
while ($row = $result->fetch_assoc()) {
echo 'ID: '.$row['id'].'<br>';
echo 'First Name: '.$row['first_name'].'<br>';
echo 'Last Name: '.$row['last_name'].'<br>';
echo 'Username: '.$row['username'].'<br><br>';
}
/* free results */
$stmt->free_result();
/* close statement */
$stmt->close();
}
/* close connection */
$mysqli->close();
正如你所看到的,你不能使用bind_result
带*
。但是,get_result
两者均可使用,但bind_result
更简单,并且消除了一些麻烦$row['name']
。
优点:
$row['name']
fetch()
缺点:
*
优点:
fetch_assoc()
缺点:
$row[]
您可以在相应的手册页上找到示例。
利弊很简单:
无论如何,如果您的想法是在应用程序代码中正确使用这两个函数,则此想法是错误的。但是,只要将它们封装在某种方法中以从查询中返回数据,使用哪一个方法都没有关系,除非您需要十倍多的代码来实现bind_result。
我注意到的主要区别是,当您尝试将嵌套的$ stmt编码到其他$ stmt中时,bind_result()
会给您带来错误2014
,该错误正在获取(没有):mysqli::store_result()
准备失败:(2014)命令不同步;您现在不能运行此命令
主代码中使用的功能。
function GetUserName($id)
{
global $conn;
$sql = "SELECT name FROM users WHERE id = ?";
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param('i', $id);
$stmt->execute();
$stmt->bind_result($name);
while ($stmt->fetch()) {
return $name;
}
$stmt->close();
} else {
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
}
}
主要代码。
$sql = "SELECT from_id, to_id, content
FROM `direct_message`
WHERE `to_id` = ?";
if ($stmt = $conn->prepare($sql)) {
$stmt->bind_param('i', $myID);
/* execute statement */
$stmt->execute();
/* bind result variables */
$stmt->bind_result($from, $to, $text);
/* fetch values */
while ($stmt->fetch()) {
echo "<li>";
echo "<p>Message from: ".GetUserName($from)."</p>";
echo "<p>Message content: ".$text."</p>";
echo "</li>";
}
/* close statement */
$stmt->close();
} else {
echo "Prepare failed: (" . $conn->errno . ") " . $conn->error;
}
bind_result
正确
$stmt->store_result()
它,则可以嵌套$stmt
在其他对象中$stmt
mysqli_stmt::bind_result
关于PHP.net的文档没有告诉我有关我的错误的任何信息……或者使用它是一种好习惯$stmt->store_result()
?
mysql_store_result ()
发送大量结果集,可能会成为问题,还是我错了?是的,对于这个示例来说,它并不是那么重要,但是...无论如何,要纠正我:)
现在,只能通过安装MySQL本机驱动程序(mysqlnd)在PHP中使用get_result()。在某些环境中,可能无法或不希望安装mysqlnd。
尽管如此,您仍然可以使用mysqli进行“选择*”查询,并使用字段名称获取结果-尽管它比使用get_result()稍微复杂一些,并且涉及使用php的call_user_func_array()函数。请参阅php中如何使用bind_result()而不是get_result()的示例,该示例执行简单的“ select *”查询,并将结果(带有列名)输出到HTML表。
我认为示例2只能像这样工作,因为store_result和get_result都从表中获取信息。
所以删除
/* Store the result (to get properties) */
$stmt->store_result();
并稍微更改顺序。这是最终结果:
$query2 = 'SELECT * FROM table WHERE id = ?';
$id = 5;
if($stmt = $mysqli->prepare($query)){
/*
Binds variables to prepared statement
i corresponding variable has type integer
d corresponding variable has type double
s corresponding variable has type string
b corresponding variable is a blob and will be sent in packets
*/
$stmt->bind_param('i',$id);
/* execute query */
$stmt->execute();
/* Get the result */
$result = $stmt->get_result();
/* Get the number of rows */
$num_of_rows = $result->num_rows;
while ($row = $result->fetch_assoc()) {
echo 'ID: '.$row['id'].'<br>';
echo 'First Name: '.$row['first_name'].'<br>';
echo 'Last Name: '.$row['last_name'].'<br>';
echo 'Username: '.$row['username'].'<br><br>';
}
/* free results */
$stmt->free_result();
$row[]
。感谢您的详细解释!一注意;根据手册,get_result()仅适用于mysqlnd。