在PHP中执行参数化查询的最佳实践?

时间:2013-07-28 17:32:26

标签: php mysql sql mysqli parameterized-query

好的,我现在可以轻松地在我的网站上查询100-200个查询,所有参数化都已完成。

以下是其中一个例子:

$mysqli = new mysqli('localhost', 'user', 'password', 'db_name');
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$stmt = $mysqli->prepare("SELECT `x` FROM `y` WHERE `z` = ?");
$stmt->bind_param("s", $test);
$stmt->execute();
$stmt->store_result();
$stmt->close();

$mysqli->close();

所以我的问题是,打开/关闭数据库连接的最佳做法是什么?

最好是保持连接打开,运行多个查询,然后关闭页面末尾的连接。像这样:

$mysqli = new mysqli('localhost', 'user', 'password', 'db_name');
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$stmt = $mysqli->prepare("SELECT `a` FROM `b` WHERE `c` = ?");
$stmt->bind_param("s", $test1);
$stmt->execute();
$stmt->store_result();
$stmt->close();

$stmt = $mysqli->prepare("SELECT `x` FROM `y` WHERE `z` = ?");
$stmt->bind_param("s", $test2);
$stmt->execute();
$stmt->store_result();
$stmt->close();

$mysqli->close();

或者最好在每次查询之前打开连接,然后立即关闭?像这样:

$mysqli = new mysqli('localhost', 'user', 'password', 'db_name');
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$stmt = $mysqli->prepare("SELECT `a` FROM `b` WHERE `c` = ?");
$stmt->bind_param("s", $test1);
$stmt->execute();
$stmt->store_result();
$stmt->close();

$mysqli->close();


$mysqli = new mysqli('localhost', 'user', 'password', 'db_name');
if ($mysqli->connect_errno) {
    printf("Connect failed: %s\n", $mysqli->connect_error);
    exit();
}

$stmt = $mysqli->prepare("SELECT `x` FROM `y` WHERE `z` = ?");
$stmt->bind_param("s", $test2);
$stmt->execute();
$stmt->store_result();
$stmt->close();

$mysqli->close();

目前我在页面打开<html>标记之前打开连接,然后在结束</html>标记之后关闭它。这是安全/良好的做法吗?

2 个答案:

答案 0 :(得分:2)

打开和关闭连接需要资源,因此目标是尽可能少地打开/关闭连接,从而在单个连接打开时执行尽可能多的查询。

这是否意味着在脚本启动时打开连接,在完成时打开连接,或者为每个查询打开/关闭,这取决于应用程序的性质。

例如,如果您的大多数脚本都有一个或多个查询,那么打开/关闭连接以及脚本的开头和结尾将是最好的。另一方面,如果您的大多数脚本都是无查询的,那么在您想要执行查询时建立连接将是您最好的选择。

答案 1 :(得分:1)

  

最好是保持连接打开,运行多个查询,然后关闭页面末尾的连接。

  

或者最好在每次查询之前打开连接,然后立即关闭?

没有

  

目前我在页面打开标记之前打开连接,然后在关闭之后关闭它。这是安全/良好的做法吗?

没有。
您的应用程序必须以这样的方式构建,以便在页面打开<head>标记之前轻松关闭连接,因为所有数据库交互必须在任何输出开始之前完成。

  

在PHP中执行参数化查询的最佳实践?

要创建一个函数,当然要在一行而不是十行执行(以及处理所有这些打开/关闭的东西),像这样

$data = $db->get("SELECT `a` FROM `b` WHERE `c` = ?", $test1);