Я использую подготовленный оператор SELECT *
из таблицы MySQL, и я не уверен, как использовать while($row = mysqli_fetch_array($stmt))
для циклического while($row = mysqli_fetch_array($stmt))
и выбора элементов из массива результатов. Это мой код, что я делаю неправильно?
$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 } ?>
Ничего плохого в ответе Дарвина, но хотелось указать на 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;?>
Нет необходимости в каких-либо привязках, и лично мне гораздо легче работать.
Вы не используете bind_result()
с fetch_array()
. Вы либо выполняете повторные вызовы fetch()
чтобы читать столбцы в отдельных переменных, связанных с bind_result()
, либо не используйте 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 } ?>
в$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()
ваши значения результата возвращаются как отдельные скаляры, а не в массив, и что вам нужно привязывать переменные результата к столбцам в порядке, поэтому вам нужно знать, какие столбцы находятся в результате.
Надеюсь, это поможет.
Не знаю, если кто-то будет заинтересован в правильном ответе на этот уже ответивший и принятый вопрос, но что за черт.
Чтобы ответить на ваш вопрос с помощью mysqli, вам нужно использовать get_result ().
Таким образом, правильное решение на основе mysqli будет
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); $mysqli = mysqli_connect($host, $username, $password, $db); $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();
а затем вы можете использовать $ data в цикле foreach для вывода, как показано в другом ответе.
В то время как для PDO правильный код будет следующим, и это действительно легче.
$link = new PDO("mysql:host=$host;dbname=$db", $username, $password); $link->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); $stmt = $link->prepare("SELECT * from `wp_posts` WHERE ID=?"); $stmt->execute([$pid]);
а затем вы можете использовать $ stmt в цикле foreach для вывода, как показано в другом ответе.