SELECT * 来自 SQL table 使用预处理语句
SELECT * from SQL table using prepared statement
我正在使用从 MySQL table 到 SELECT *
的准备好的语句,我不确定如何使用 while($row = mysqli_fetch_array($stmt))
循环和 select 结果数组中的项目。这是我的代码,我做错了什么?
$link = mysqli_connect($host, $username, $password, $db);
$query = "SELECT * from `wp_posts` WHERE ID=? ";
//$result = mysqli_query($link, $query);
$stmt = mysqli_prepare($link, $query);
if($stmt){
mysqli_stmt_bind_param($stmt, "i", $pid);
mysqli_stmt_bind_result($stmt, $dbpid);
mysqli_stmt_execute($stmt);
mysqli_stmt_fetch($stmt);
}
while($row = mysqli_fetch_array($stmt)){
?>
<h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $row['post_content']; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
您没有将 bind_result()
与 fetch_array()
一起使用。您可以重复调用 fetch()
以将列读入与 bind_result()
或 [=34 绑定的单个变量中=]不要使用 bind_result()
,调用mysqli_smt_get_result()
将结果拉入mysqli_result
对象,重复调用mysqli_fetch_array()
加载行进入你的 $row
数组。
由于您使用的是 SELECT *
,未绑定结果方法会更合乎逻辑。对于您的代码:
$link = mysqli_connect($host, $username, $password, $db);
$query = "SELECT * FROM wp_posts WHERE ID = ? ";
$stmt = mysqli_prepare($link, $query)
or die("Unable to prepare statement: " . $link->error);
mysqli_stmt_bind_param($stmt, "i", $pid);
mysqli_stmt_execute($stmt)
or die("Unable to execute query: " . $stmt->error);
$rslt = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_array($rslt))
{
?>
<h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $row['post_content']; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
只是为了比较,下面是您将如何使用 bind_result()
(以及如何使用对象语法):
$link = new mysqli($host, $username, $password, $db);
$query = "SELECT post_title, post_content FROM wp_posts WHERE ID = ? ";
$stmt = $link->prepare($query);
or die("Unable to prepare statement: " . $link->error);
$stmt->bind_param("i", $pid);
$stmt->execute()
or die("Unable to execute query: " . $stmt->error);
$stmt->bind_result($postTitle, $postContent)
or die("Unable to bind result: " . $stmt->error);
while($stmt->fetch()){
?>
<h2 align="center"> <?php echo $postTitle; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $postContent; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
请注意,当使用 bind_result()
时,您的结果值将作为单独的标量而不是数组返回,并且您需要按顺序将结果变量绑定到列 , 所以你需要知道结果中有哪些列。
希望对您有所帮助。
达尔文的回答没有错,但想指出 PDO 作为语法更简单的替代方案:
<?php
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$link = new PDO("mysql:host=$host;dbname=$db", $username, $password, $options);
$stmt = $link->prepare("SELECT * from `wp_posts` WHERE ID=?");
$stmt->execute([$pid]);
$result = $stmt->fetchAll();
// Now you have a plain array to work with, database work is over
foreach ($result as $row):
?>
<h2 style="text-align:center;margin:0 auto">
<?=$row["post_title"]?>
</h2>
<br/>
<div class="paracenter">
<p id="cont">
<?=$row["post_content"]?>
</p>
<hr style="color:black;width:10%"/>
</div>
<?php endforeach;?>
根本不需要任何绑定,我个人觉得使用它更容易。
要使用 mysqli 回答您的问题,您必须使用 get_result()
因此,正确的基于 mysqli 的解决方案将是
$query = "SELECT * from `wp_posts` WHERE ID=? ";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $pid);
$stmt->execute();
$res = $stmt->get_result();
$data = $res->fetch_all(MYSQLI_ASSOC);
(这段代码的完整解释可以在我的文章中找到,Mysqli SELECT query with prepared statements)
然后您可以在 foreach 循环中使用 $data 作为另一个答案中显示的输出。
这是一个 'prepared select statement' 的简单示例并回显结果。
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['uname']) && isset($_POST['pword'])) {
$stmt = $conn->prepare("SELECT * FROM members WHERE username = ? && password = ?");// substitute '$conn' with whatever you named your database connection.
$stmt->bind_param("ss", $username, $password);
$username = $_POST['uname'];
$password = $_POST['pword'];
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows ===0) exit('Not-A-Thing');
while($row = $result->fetch_assoc()) { echo $row['id'] . "<br>" . $row['username']; }
$stmt->close();
}
这只是一个例子。如果您正在搜索如何绑定参数,那么您很可能已经知道“?”和“ss”的含义。如果您以前查询过数据库,则不需要解释。
我正在使用从 MySQL table 到 SELECT *
的准备好的语句,我不确定如何使用 while($row = mysqli_fetch_array($stmt))
循环和 select 结果数组中的项目。这是我的代码,我做错了什么?
$link = mysqli_connect($host, $username, $password, $db);
$query = "SELECT * from `wp_posts` WHERE ID=? ";
//$result = mysqli_query($link, $query);
$stmt = mysqli_prepare($link, $query);
if($stmt){
mysqli_stmt_bind_param($stmt, "i", $pid);
mysqli_stmt_bind_result($stmt, $dbpid);
mysqli_stmt_execute($stmt);
mysqli_stmt_fetch($stmt);
}
while($row = mysqli_fetch_array($stmt)){
?>
<h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $row['post_content']; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
您没有将 bind_result()
与 fetch_array()
一起使用。您可以重复调用 fetch()
以将列读入与 bind_result()
或 [=34 绑定的单个变量中=]不要使用 bind_result()
,调用mysqli_smt_get_result()
将结果拉入mysqli_result
对象,重复调用mysqli_fetch_array()
加载行进入你的 $row
数组。
由于您使用的是 SELECT *
,未绑定结果方法会更合乎逻辑。对于您的代码:
$link = mysqli_connect($host, $username, $password, $db);
$query = "SELECT * FROM wp_posts WHERE ID = ? ";
$stmt = mysqli_prepare($link, $query)
or die("Unable to prepare statement: " . $link->error);
mysqli_stmt_bind_param($stmt, "i", $pid);
mysqli_stmt_execute($stmt)
or die("Unable to execute query: " . $stmt->error);
$rslt = mysqli_stmt_get_result($stmt);
while($row = mysqli_fetch_array($rslt))
{
?>
<h2 align="center"> <?php echo $row['post_title']; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $row['post_content']; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
只是为了比较,下面是您将如何使用 bind_result()
(以及如何使用对象语法):
$link = new mysqli($host, $username, $password, $db);
$query = "SELECT post_title, post_content FROM wp_posts WHERE ID = ? ";
$stmt = $link->prepare($query);
or die("Unable to prepare statement: " . $link->error);
$stmt->bind_param("i", $pid);
$stmt->execute()
or die("Unable to execute query: " . $stmt->error);
$stmt->bind_result($postTitle, $postContent)
or die("Unable to bind result: " . $stmt->error);
while($stmt->fetch()){
?>
<h2 align="center"> <?php echo $postTitle; ?> </h2><br>
<div class="paracenter">
<p id="cont"><?php echo $postContent; ?></p>
<hr color="black" width="10%">
</div>
<?php } ?>
请注意,当使用 bind_result()
时,您的结果值将作为单独的标量而不是数组返回,并且您需要按顺序将结果变量绑定到列 , 所以你需要知道结果中有哪些列。
希望对您有所帮助。
达尔文的回答没有错,但想指出 PDO 作为语法更简单的替代方案:
<?php
$options = [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
];
$link = new PDO("mysql:host=$host;dbname=$db", $username, $password, $options);
$stmt = $link->prepare("SELECT * from `wp_posts` WHERE ID=?");
$stmt->execute([$pid]);
$result = $stmt->fetchAll();
// Now you have a plain array to work with, database work is over
foreach ($result as $row):
?>
<h2 style="text-align:center;margin:0 auto">
<?=$row["post_title"]?>
</h2>
<br/>
<div class="paracenter">
<p id="cont">
<?=$row["post_content"]?>
</p>
<hr style="color:black;width:10%"/>
</div>
<?php endforeach;?>
根本不需要任何绑定,我个人觉得使用它更容易。
要使用 mysqli 回答您的问题,您必须使用 get_result()
因此,正确的基于 mysqli 的解决方案将是
$query = "SELECT * from `wp_posts` WHERE ID=? ";
$stmt = $mysqli->prepare($query);
$stmt->bind_param("i", $pid);
$stmt->execute();
$res = $stmt->get_result();
$data = $res->fetch_all(MYSQLI_ASSOC);
(这段代码的完整解释可以在我的文章中找到,Mysqli SELECT query with prepared statements)
然后您可以在 foreach 循环中使用 $data 作为另一个答案中显示的输出。
这是一个 'prepared select statement' 的简单示例并回显结果。
if($_SERVER["REQUEST_METHOD"] == "POST" && isset($_POST['uname']) && isset($_POST['pword'])) {
$stmt = $conn->prepare("SELECT * FROM members WHERE username = ? && password = ?");// substitute '$conn' with whatever you named your database connection.
$stmt->bind_param("ss", $username, $password);
$username = $_POST['uname'];
$password = $_POST['pword'];
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows ===0) exit('Not-A-Thing');
while($row = $result->fetch_assoc()) { echo $row['id'] . "<br>" . $row['username']; }
$stmt->close();
}
这只是一个例子。如果您正在搜索如何绑定参数,那么您很可能已经知道“?”和“ss”的含义。如果您以前查询过数据库,则不需要解释。