在预准备语句中绑定参数

时间:2017-04-11 22:13:58

标签: php mysql

我今天早些时候发现,我在使用准备好的陈述时非常落后。我试着做一个准备好的声明,从我的数据库中获取一些数据。

我想在我的数据库中打印所有行,但我不太确定如何在我的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();

?>

1 个答案:

答案 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列出您的数据类型(如上所述)以及您的变量或数据。

更新2

$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中并将其写入段落标记。