SELECT * из таблицы SQL с помощью подготовленного оператора

Я использую подготовленный оператор 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 для вывода, как показано в другом ответе.