PHP 我有一个数据库连接文件,我应该把我的数据库查询函数放在同一个文件中吗
PHP I have a database connect file, should i put my database querie functions in the same file
为了更好地解释我的问题,我有两个文件:dbh.inc.php
$dbServername = "localhost";
$dbUsername = "xxxxx";
$dbPassword = "secret";
$dbName = "databasename";
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
mysqli_set_charset($conn,"utf8");
if (!$conn) {
die("Connection failed: ".mysqli_connect_error());
}
$table1 = "users";//1
$table2 = "userprofile";//2
$table3 = "twofactorauth";//3
还有:数据库-query.func.php
function selectdb($data, $values, $url) {
include ('dbh.inc.php');
extract($data);
extract($values);
switch ($data['table']) {
case '1':
$table = $table1;
break;
case '2':
$table = $table2;
break;
case '3':
$table = $table3;
break;
}
$sql = "SELECT $rows FROM $table WHERE $where;";
print_r($sql);
die();
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
mysqli_stmt_close($stmt);
mysqli_close($conn);
header("Location: ".$url."?error=sqlerror");
die();
} else {
$amount = str_repeat('s', count($values));
$values = array_values($values);
mysqli_stmt_bind_param($stmt, $amount, ...$values);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$getResult = mysqli_fetch_assoc($result);
mysqli_stmt_close($stmt);
mysqli_close($conn);
$new = array_push($getResult, 'true');
return $getResult;
}
}
所以第一个持有数据库连接,后者暂时有插入、更新和select的动态查询。我想知道我是否应该将这两个文件合并为一个。因为每次我需要连接时,我总是使用我的一个查询,反之亦然?
还有 2 个奖励问题:正如您在我的连接文件中看到的那样,我有我的 table 名字,我在其他文件和函数中使用数字连接数字和名字。
最后我应该使用 PDO,为什么?
一般性地回答您的问题 - 是的,您可以将辅助函数放在建立 sql 连接的同一文件中。
但是,你的实际功能的代码至少是有问题的。或者,说实话,您的函数 selectdb()
对程序员来说是 折磨 ,不应该存储在任何地方 。坚持按原样编写的自然 SQL 查询。您不需要数字来表示 tables。您不需要 $rows 变量。一切都可以直接写在 SQL 字符串中。您所需要的只是一个简单的辅助函数,它可以减少 运行 查询所需的代码量。
这里有一个这样的例子mysqli include file
一旦它包含在您的脚本中,您就可以使用它来 运行 任何 mysql 查询,任何 table 以及任何变量列表。查看以下示例(您可以将以下代码块复制并粘贴到您的文件中,然后 运行 按原样):
<?php
require 'mysqli.php';
#Create a temporary table
$conn->query("CREATE temporary TABLE tmp_mysqli_helper_test
(id int auto_increment primary key, name varchar(9))");
# populate it with sample data
$sql = "INSERT INTO tmp_mysqli_helper_test (name) VALUES (?),(?),(?)";
$stmt = prepared_query($conn, $sql, ['Sam','Bob','Joe']);
echo "Affected rows: $stmt->affected_rows\n";
echo "Last insert id: $conn->insert_id\n";
# Getting rows in a loop
$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id > ?";
$res = prepared_query($conn, $sql, [1])->get_result();
while ($row = $res->fetch_assoc())
{
echo "{$row['id']}: {$row['name']}\n";
}
# Getting one row
$id = 1;
$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id=?";
$row = prepared_query($conn, $sql, [$id])->get_result()->fetch_assoc();
echo "{$row['id']}: {$row['name']}\n";
# Update
$id = 1;
$new = 'Sue';
$sql = "UPDATE tmp_mysqli_helper_test SET name=? WHERE id=?";
$affected_rows = prepared_query($conn, $sql, [$new, $id])->affected_rows;
echo "Affected rows: $affected_rows\n";
# Getting an array of rows
$start = 0;
$limit = 10;
$sql = "SELECT * FROM tmp_mysqli_helper_test LIMIT ?,?";
$all = prepared_query($conn, $sql, [$start, $limit])->get_result()->fetch_all(MYSQLI_ASSOC);
foreach ($all as $row)
{
echo "{$row['id']}: {$row['name']}\n";
}
正如你所看到的,一个合适的辅助函数可以保持SQL所有的灵活性和可读性,同时减少代码量。
为了更好地解释我的问题,我有两个文件:dbh.inc.php
$dbServername = "localhost";
$dbUsername = "xxxxx";
$dbPassword = "secret";
$dbName = "databasename";
$conn = mysqli_connect($dbServername, $dbUsername, $dbPassword, $dbName);
mysqli_set_charset($conn,"utf8");
if (!$conn) {
die("Connection failed: ".mysqli_connect_error());
}
$table1 = "users";//1
$table2 = "userprofile";//2
$table3 = "twofactorauth";//3
还有:数据库-query.func.php
function selectdb($data, $values, $url) {
include ('dbh.inc.php');
extract($data);
extract($values);
switch ($data['table']) {
case '1':
$table = $table1;
break;
case '2':
$table = $table2;
break;
case '3':
$table = $table3;
break;
}
$sql = "SELECT $rows FROM $table WHERE $where;";
print_r($sql);
die();
$stmt = mysqli_stmt_init($conn);
if (!mysqli_stmt_prepare($stmt, $sql)) {
mysqli_stmt_close($stmt);
mysqli_close($conn);
header("Location: ".$url."?error=sqlerror");
die();
} else {
$amount = str_repeat('s', count($values));
$values = array_values($values);
mysqli_stmt_bind_param($stmt, $amount, ...$values);
mysqli_stmt_execute($stmt);
$result = mysqli_stmt_get_result($stmt);
$getResult = mysqli_fetch_assoc($result);
mysqli_stmt_close($stmt);
mysqli_close($conn);
$new = array_push($getResult, 'true');
return $getResult;
}
}
所以第一个持有数据库连接,后者暂时有插入、更新和select的动态查询。我想知道我是否应该将这两个文件合并为一个。因为每次我需要连接时,我总是使用我的一个查询,反之亦然?
还有 2 个奖励问题:正如您在我的连接文件中看到的那样,我有我的 table 名字,我在其他文件和函数中使用数字连接数字和名字。 最后我应该使用 PDO,为什么?
一般性地回答您的问题 - 是的,您可以将辅助函数放在建立 sql 连接的同一文件中。
但是,你的实际功能的代码至少是有问题的。或者,说实话,您的函数 selectdb()
对程序员来说是 折磨 ,不应该存储在任何地方 。坚持按原样编写的自然 SQL 查询。您不需要数字来表示 tables。您不需要 $rows 变量。一切都可以直接写在 SQL 字符串中。您所需要的只是一个简单的辅助函数,它可以减少 运行 查询所需的代码量。
这里有一个这样的例子mysqli include file
一旦它包含在您的脚本中,您就可以使用它来 运行 任何 mysql 查询,任何 table 以及任何变量列表。查看以下示例(您可以将以下代码块复制并粘贴到您的文件中,然后 运行 按原样):
<?php
require 'mysqli.php';
#Create a temporary table
$conn->query("CREATE temporary TABLE tmp_mysqli_helper_test
(id int auto_increment primary key, name varchar(9))");
# populate it with sample data
$sql = "INSERT INTO tmp_mysqli_helper_test (name) VALUES (?),(?),(?)";
$stmt = prepared_query($conn, $sql, ['Sam','Bob','Joe']);
echo "Affected rows: $stmt->affected_rows\n";
echo "Last insert id: $conn->insert_id\n";
# Getting rows in a loop
$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id > ?";
$res = prepared_query($conn, $sql, [1])->get_result();
while ($row = $res->fetch_assoc())
{
echo "{$row['id']}: {$row['name']}\n";
}
# Getting one row
$id = 1;
$sql = "SELECT * FROM tmp_mysqli_helper_test WHERE id=?";
$row = prepared_query($conn, $sql, [$id])->get_result()->fetch_assoc();
echo "{$row['id']}: {$row['name']}\n";
# Update
$id = 1;
$new = 'Sue';
$sql = "UPDATE tmp_mysqli_helper_test SET name=? WHERE id=?";
$affected_rows = prepared_query($conn, $sql, [$new, $id])->affected_rows;
echo "Affected rows: $affected_rows\n";
# Getting an array of rows
$start = 0;
$limit = 10;
$sql = "SELECT * FROM tmp_mysqli_helper_test LIMIT ?,?";
$all = prepared_query($conn, $sql, [$start, $limit])->get_result()->fetch_all(MYSQLI_ASSOC);
foreach ($all as $row)
{
echo "{$row['id']}: {$row['name']}\n";
}
正如你所看到的,一个合适的辅助函数可以保持SQL所有的灵活性和可读性,同时减少代码量。