拥有这样的功能是个好主意per se。这表明你内心是一名程序员,而不仅仅是一个像乐高人物一样用现成的积木编写 PHP 的修补匠。这样的函数可以极大地改进你的代码。
但权力越大,责任也越大。这样的函数是一个SQL注入的持续危险, 通过表名和字段名。你应该照顾好这一点。更不用说它应该正确地使用准备好的陈述对于数据。
首先,您需要一个通用函数来使用查询和参数数组执行任意 MySQL 查询。我有一个简单的mysqli 辅助函数 https://phpdelusions.net/mysqli/simple为你。这将是执行所有准备好的查询的基本函数:
function prepared_query($mysqli, $sql, $params, $types = "")
{
$types = $types ?: str_repeat("s", count($params));
$stmt = $mysqli->prepare($sql);
$stmt->bind_param($types, ...$params);
$stmt->execute();
return $stmt;
}
现在我们可以开始动态构建 SQL 查询。为此我们需要一个可以转义标识符的函数
function escape_mysql_identifier($field){
return "`".str_replace("`", "``", $field)."`";
}
它将使标识符变得安全,至少只要您使用 Unocode。
现在我们可以继续创建正确的 SQL 字符串。我们需要创建一个带有占位符的 SQL,如下所示:
INSERT INTO `staff` (`name`,`occupation`) VALUES (?,?)
因此,让我们编写一个函数来创建这样的查询
function create_insert_query($table, $keys)
{
$keys = array_map('escape_mysql_identifier', $keys);
$fields = implode(",", $keys);
$table = escape_mysql_identifier($table);
$placeholders = str_repeat('?,', count($keys) - 1) . '?';
return "INSERT INTO $table ($fields) VALUES ($placeholders)";
}
最后我们可以编写一直以来寻求的 crud 函数:
function crud_insert($conn, $table, $data) {
$sql = create_insert_query($table, array_keys($data));
prepared_query($conn, $sql, array_values($data));
}
像这样称呼
$args = ['name' => "D'Artagnan", "occupation" => 'musketeer'];
crud_insert($link, "test_table", $args);