如何避免在 PHP 中重复 MySQL 查询代码的相似部分?

How to avoid repeating similar sections of MySQL query code in PHP?

为了避免在我的 PHP 中重复非常相似的 update/insert MySQL 查询代码部分,我创建了这两个函数。有没有更好的方法?.. 或者这种方法是否有效且安全?这是一个低流量应用程序。

funcConnectToDatabase("localhost","MyDatabase");

funcUpdatePHPVariableInMySQL( "TableName","RequiredColumnName","RequiredColumnValue","UpdateColumnName","UpdateColumnValue");

function funcConnectToDatabase($thisHost,$thisDatabaseName)
{
  global $pdo, $username, $password;
  require_once($_SERVER['DOCUMENT_ROOT'] . '/../sql.php'); //includes credentials from outside root
  $pdo = new PDO("mysql:host=$thisHost;dbname=$thisDatabaseName;charset=gbk",$username,$password);
  $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 
};

function funcUpdatePHPVariableInMySQL($thisTableName,$thisRequiredColumnName,$thisRequiredColumnValue,$thisUpdateColumnName,$thisUpdateColumnValue)
{
  global $pdo;
  $sqlquery = $pdo->prepare("SELECT * FROM $thisTableName WHERE $thisRequiredColumnName = :$thisRequiredColumnName");
  $sqlquery->bindParam(":$thisRequiredColumnName",$thisRequiredColumnValue);
  $sqlquery->execute();
  $rows = $sqlquery->fetchAll(PDO::FETCH_ASSOC);  
  if (count($rows) > 0) {
    $sqlquery = $pdo->prepare("UPDATE $thisTableName SET $thisUpdateColumnName='$thisUpdateColumnValue' WHERE $thisRequiredColumnName = :$thisRequiredColumnValue");
    $sqlquery->bindParam(":$thisRequiredColumnValue",$thisRequiredColumnValue);
    $sqlquery->execute();
  }
  else
  {
    $sqlquery = $pdo->prepare("INSERT INTO $thisTableName ($thisUpdateColumnName) VALUES (:$thisUpdateColumnValue)");
    $sqlquery->bindParam(":$thisUpdateColumnValue",$thisUpdateColumnValue);
    $sqlquery->execute();
  };
};

谢谢你,马克

无论应用是否低容量,编写这样的代码都不是最佳做法。每次调用函数时,您都在一遍又一遍地声明相同的 pdo 对象,这效率不高。您应该查看抽象代码以查看 OOP 概念。例如,创建 PDO 对象一次,然后 return 在连接到 DB 时创建它的一个实例。

funcUpdatePHPVariableInMySQL

你最好使用类似 switch 语句的东西,例如:

switch (n) {
    case update:
update DB;
        break;
    case insert:
insert into DB;       
 break;
    case delete:
delete from DB;
        break;
    ...
    default:
 xyz;
}

上面看起来硬编码太多,无法满足应用程序的需要。那只是我的两分钱。