我今天早些时候发现,我在使用准备好的陈述时非常落后。我试着做一个准备好的声明,从我的数据库中获取一些数据。
我想在我的数据库中打印所有行,但我不太确定如何在我的while循环中执行此操作?
<?php
/* Prepare */
if ($stmt = $mysqli->prepare("SELECT * FROM stores")) {
echo "Prepare failed: (" . $mysqli->errno . ") " . $mysqli->error;
}
/* Bind and execute */
$id = null;
$headline = null;
$description = null;
$place = null;
if (!$stmt->bind_param("i", $id, "s", $headline, "s", $description, "s", $place)) {
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute()) {
echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;
}
while ($stmt->fetch()) {
/* Loop through my rows in MySQL and print all rows*/
echo $id, $headline, $description,$place;
}
/* Close Statement */
$stmt->close();
/* Close Connection */
$mysqli->close();
?>
答案 0 :(得分:1)
if (!$stmt->bind_param("isss", $id, $headline, $description, $place))
{
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
你会想要那样做。正如@ Fred-ii在评论中所说。你的语法错了。
它的工作原理是bind_param
的第一个参数是你的所有数据类型作为一个字符串,然后你列出你的数据。确保使用正确的数据类型和适量的参数。
进一步检查了您的代码后,我发现您没有正确使用prepare
。我将在下面添加一个演示,以便您可以将其作为指南。
$stmt = $mysqli->prepare("SELECT * FROM myTable WHERE id = ? AND name = ?");
if (!$stmt->bind_param("is", $id, $name))
{
echo "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error;
}
if (!$stmt->execute())
{
echo "Execution failed: (" . $stmt->errno . ") " . $stmt->error;
}
问号描绘了每个变量。这意味着您将?
放在您想要变量的位置
然后使用bind_param
列出您的数据类型(如上所述)以及您的变量或数据。
$errors = array(); // store errors here
$stmt = $mysqli->prepare("SELECT name FROM myTable WHERE id = ?"); // prepare our statement
// check that our parameters match, if not then add error
if (!$stmt->bind_param("i", $id))
{
array_push($errors, "Binding parameters failed: (" . $stmt->errno . ") " . $stmt->error);
}
// if no errors and statement fails to run
if (count($errors) <= 0 && !$stmt->execute())
{
array_push($errors, "Execution failed: (" . $stmt->errno . ") " . $stmt->error);
}
// no statement errors
if (count($errors) <= 0)
{
$stmt->bind_result($name); // store the results of the statement in this variable
// iterate through each row of the database
while ($stmt->fetch())
{
echo $name;
}
}
// report the errors
else
{
echo "<h3>Errors</h3>";
foreach ($errors as $error)
{
echo "<p>$error</p>";
}
}
$errors = array()
array_push($errors, "...")
array_push
function将以array_push($array, $var)
的语法向数组添加变量,其中$array
是将添加项目的数组,$var
是您要添加的项目。count($errors)
count
function将计算数组中元素的数量
我用它来查看是否有任何错误添加到数组。当我初始化$errors
时,其中没有元素,因此它将返回0. $stmt->bind_result($name)
while loop
之外编写的,因为它用于告诉语句我们要将所有列name
存储在名为$name
的变量中。while ($stmt->fetch())
while loop
的每次迭代都是数据库的一行。在我的示例中,我只是回显了name
列的值
可以存储多个列。只需在SQL查询(SELECT col1, col2, col3 FROM mytable
)中添加该列,然后将每个列存储在bind_result
($stmt->bind_result($col1, $col2, $col3);
中的变量中。请注意,它们不必与列名称相同;这也是有效的$stmt->bind_result($myVar, $someVar, $anotherVar);
)。foreach ($errors as $error)
foreach
接受一个数组并迭代它,将每个迭代存储在as
之后的变量中
在这个例子中,我们将错误存储在名为$errors
的数组中,并将每个错误存储在$error
中并将其写入段落标记。