【问题标题】:PHP I have a database connect file, should i put my database querie functions in the same file [closed]PHP我有一个数据库连接文件,我应该把我的数据库查询函数放在同一个文件中[关闭]
【发布时间】:2020-02-27 15:16:03
【问题描述】:

为了更好地解释我的问题,我有两个文件: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

还有:database-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;
  }
}

所以第一个持有数据库连接,而后者目前有插入、更新和选择的动态查询。我想知道我是否应该将这两个文件合并为一个。因为每次我需要连接时,我总是使用我的一个查询,反之亦然?

还有 2 个额外问题:正如您在我的连接文件中看到的,我有我的表名,我在其他文件中使用数字,并且在函数中将数字连接到名称。 最后我应该使用 PDO,为什么?

【问题讨论】:

  • 这是一种糟糕的做法,原因不止一个
  • 一个是这将导致您为脚本中的每个查询打开一个连接。这是一个相对缓慢的过程
  • 为什么要通过给它们编号来混淆表名?只会让维护变得困难
  • 看来使用这个你只能返回一个结果行

标签: php database mysqli database-connection


【解决方案1】:

一般来说回答您的问题 - 是的,您可以将辅助函数放在建立 sql 连接的同一文件中。

但是,您的实际功能的代码至少是有问题的。或者,说实话,你的函数selectdb() 是程序员的折磨,不应该存储在任何地方。坚持按原样编写的自然 SQL 查询。您不需要数字来表示表格。您不需要 $rows 变量。一切都可以直接写在 SQL 字符串中。您所需要的只是一个简单的辅助函数,它可以减少运行查询所需的代码量。

这是mysqli include file的一个例子

一旦它被包含在您的脚本中,您就可以使用它来运行任何 mysql 查询、对任何表以及任何变量列表。查看以下示例(您可以将以下代码块复制并粘贴到您的文件中并按原样运行):

<?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 的所有灵活性和可读性,同时减少代码量。

【讨论】:

  • 好的,首先我学习了如何编写动态查询。其次,谢谢?,我查看了您的链接,那里确实有一些有用的东西。希望我很久以前就知道你的网站。回到书桌。
猜你喜欢
  • 2011-04-14
  • 1970-01-01
  • 2011-01-04
  • 1970-01-01
  • 2013-09-10
  • 1970-01-01
  • 2013-12-27
  • 2022-01-05
  • 2015-12-25
相关资源
最近更新 更多