每个查询有 1 个连接还是每个查询有单独的连接更好?

Is it better to have 1 connection per query or separate connections for each?

是 better/secure 为每个查询创建一个单独的数据库连接 (sample1) 还是我应该只为两个查询创建一个数据库连接 (sample2)?

我有 2 个查询要对数据库进行。

  1. Select(检查 table 中是否存在电子邮件)。
  2. 插入(如果电子邮件不存在,则在 table 中创建记录)。

我主要对一种方法相对于另一种方法的安全性和资源成本感兴趣。

注意:下面的示例代码是用户注册码的简化版本。

示例 1。

<?php
    $NEW_EMAIL="sample@gmail.com";

    $prep_sel = 'SELECT email FROM users WHERE email=?';
    $link1 = mysqli_stmt_init($dbc);

    if (mysqli_stmt_prepare($link1, $prep_sel)) {
        mysqli_stmt_bind_param($link1, 's', $e);
        mysqli_stmt_execute($link1);
        mysqli_stmt_store_result($link1);
    }

    // If record does not exist, then insert it.

    if (mysqli_stmt_num_rows($link1) == 0) { // Available.
        $prep_ins= 'INSERT INTO users (email) VALUES (?)';
        $link2 = mysqli_stmt_init($dbc);

        if (mysqli_stmt_prepare($link2, $prep_ins)) {
            mysqli_stmt_bind_param($link2, 'sssss', $NEW_EMAIL);
            mysqli_stmt_execute($link2);
        }
    }
?>

样本 2.

<?php
    $NEW_EMAIL="sample@gmail.com";

    $prep_sel = 'SELECT email FROM users WHERE email=?';
    $link1 = mysqli_stmt_init($dbc);

    if (mysqli_stmt_prepare($link1, $prep_sel)) {
        mysqli_stmt_bind_param($link1, 's', $e);
        mysqli_stmt_execute($link1);
        mysqli_stmt_store_result($link1);
    }

    // If record does not exist, then insert it.

    if (mysqli_stmt_num_rows($link1) == 0) { // Available.
        $prep_ins= 'INSERT INTO users (email) VALUES (?)';

        if (mysqli_stmt_prepare($link1, $prep_ins)) {
            mysqli_stmt_bind_param($link1, 'sssss', $NEW_EMAIL);
            mysqli_stmt_execute($link1);
        }
    }
?>

是否有示例 3 选项?如果您将数据库中的 email 列更改为 UNIQUE,这意味着不允许重复的电子邮件。请参阅下面的 table 示例:

CREATE TABLE users
(
    id int auto_increment primary key, 
    email varchar(20) unique
);

如果您尝试注册一个已经使用该给定电子邮件的新帐户,您将收到错误 1062(又名重复输入错误)。

因此,与其 运行同时使用 SELECT 和基于此的 INSERT 查询,您可以简单 运行 给定的 INSERT 查询您的电子邮件列是 UNIQUE:

<?php
// Your database info
$db_host = 'xxxx';
$db_user = 'xxxx';
$db_pass = 'xxxx';
$db_name = 'xxxx';

// hardcoded email for testing purposes
$test_email ="sample@gmail.com";

// SQL query
$sql = 'INSERT INTO users (email) VALUES (?)';

// connect to database
$con = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if ($con->connect_error)
{
    die('Connect Error (' . mysqli_connect_errno() . ') '. mysqli_connect_error());
}

// Prepare the query to make sure it is good to go
if (!$result = $con->prepare($sql))
{
    die('Query failed: (' . $con->errno . ') ' . $con->error);
}

// bind and test if the parameters are valid
if (!$result->bind_param('s', $test_email))
{
    die('Binding parameters failed: (' . $result->errno . ') ' . $result->error);
}

// execute and see if it executed as expected.
if (!$result->execute())
{
    if ($result->errno === 1062)
    {
        die("Email already in use...");
    }
    else
    {
        die('Execute failed: (' . $result->errno . ') ' . $result->error);
    }
}
else
{
    echo "account created!!";
}

In regards whether its better to have a single connection or multiple connections, this is a very good reading but as a resume you could reference your self to In PHP/MySQL should I open multiple database connections or share 1?