Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/google-maps/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在PHP中执行参数化查询的最佳实践?_Php_Mysql_Sql_Mysqli_Parameterized Query - Fatal编程技术网

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

在PHP中执行参数化查询的最佳实践?,php,mysql,sql,mysqli,parameterized-query,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("SEL

好的,现在我在我的网站上有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();
目前,我在页面打开
标记之前打开连接,然后在关闭
标记之后关闭连接。这是安全/良好的做法吗

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

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

没有

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

否。
您的应用程序的结构必须确保在页面打开
标记之前能够轻松关闭连接,因为所有的数据库交互必须在任何输出开始之前完成

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

当然,要创建一个函数,要在一行而不是十行中执行(并处理所有这些开始/结束的内容),如下所示

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

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

这是指在脚本启动时打开连接,在脚本完成时关闭连接,还是打开/关闭每个查询,取决于应用程序的性质


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

顺便说一句,所有这些与参数化查询无关,而是与中的查询有关general@YourCommonSense我意识到,然而,上次我在这个网站上发布了一个问题——事实上,你自己也曾因为我没有使用参数化查询而责骂过我。以这种方式发布我的问题是为了确保问题是有效的,并且任何评论都不会因为进入参数化查询的赞成和反对意见而被旁敲侧击。为什么在
之前必须关闭连接?不一定要关闭连接,但是每个数据库交互显然都必须在页面打开标记之前完成。我从来没有听说过这样的要求-你能举出一个来源吗?哦,只要从显示逻辑分离中读一些关于业务逻辑的内容就可以了。我手边没有链接,因为我发现这个原则本身就很合乎逻辑,但我相信它也很容易被谷歌搜索到。简言之,在所有数据准备就绪之前不应启动任何输出。我理解将这些内容分开是一种很好的做法,但说连接“必须在[…]
之前关闭”是错误的,而事实上,它们并没有关闭。也许“不得不”应该改为“应该”。