PHP准备语句。 $ stmt,fetch_array()

时间:2014-01-13 19:13:19

标签: php mysqli prepared-statement

我正在更新mysqli数据库查询以使用预准备语句。这是当前的PHP代码:

$randomQQuery = "SELECT question FROM question WHERE tagOne='".$sub."' ORDER BY RAND() LIMIT 1";
$randomQ = mysqli_query($dbc,$randomQQuery);
$qRow = mysqli_fetch_array($randomQ);
$question = $qRow['question'];

这是我最初的准备陈述:

$randomQQuery = $dbc->prepare("SELECT question FROM question WHERE tagOne=? ORDER BY RAND() LIMIT 1");
$randomQQuery->bind_param('s',$sub);
$randomQQuery->execute();
$qRow = $randomQQuery->fetch_array();
$question = $qRow['question'];
  1. 我是否需要为变量$ stmt命名?我看过的所有例子都使用了这个名字。
  2. 如果是这样,我如何区分众多SQL查询和使用第二个不同的$ stmt?
  3. 我是否正在获取数组并正确获取$ question?我明白“约束结果”是一种选择;从安全角度来看这些最佳实践还是效率更高?

3 个答案:

答案 0 :(得分:2)

1 - 事实并非如此,实际上你甚至没有将它命名为$ stmt?

2 - 从#1开始不需要这个;)

3 - 没关系......不是很好,一切都取决于你的需求

您所做的只对1行有效,否则至少需要一段时间

while($row = $result->fetch_array())
{
    $rows[] = $row;
}

最佳实践至少会验证执行没有返回false ..

同样默认情况下,它使用MYSQL_BOTH,它为您提供数组和编号数组。如果您不需要两者都可以节省一些内存:

/* numeric array */
$row = $result->fetch_array(MYSQLI_NUM);
printf ("%s (%s)\n", $row[0], $row[1]);

/* associative array */
$row = $result->fetch_array(MYSQLI_ASSOC);
printf ("%s (%s)\n", $row["Name"], $row["CountryCode"]);

参考:http://ca3.php.net/mysqli_fetch_array

答案 1 :(得分:1)

1:不。

3:获取数组通常由while($qRow = $randomQQuery->fetch_array()) { }完成。我会选择$row = $randomQQuery->fetch_row();

答案 2 :(得分:-1)

这是一些示例代码,如果它有帮助,可以很容易理解。我使用$ stmt(这就是我学习如何操作的方式)并且我已经无数次地使用了它。我知道它可能不完全是您所需要的,但这可以帮助或帮助其他有类似问题的人。

include "../dbConnFile.php";

if($conn){

    if($_POST['example1']!='' && $_POST['example2']!=''){//checks input

        $stmt = $conn->prepare("INSERT INTO database (example1, example2) VALUES (?,?)");

        $stmt->bind_param("ss", $_POST['example1'], $_POST['example2']);

        $stmt->execute();
        $stmt->close();
    }

    $result=$conn->query("SELECT example1, example2 FROM datasbase ORDER BY ____ DESC");

    if($result){
        while($tempRowHolder = mysqli_fetch_array($result,MYSQL_ASSOC)){
            $records[] = $tempRowHolder;
        }
    }
}