2 回答
TA贡献1875条经验 获得超5个赞
原来的功能在很多层面上都是错误的。重新创建它的功能是没有意义的。
基本上你在这里讨价还价的只是几个 SQL 关键字。但这些关键字有助于提高可读性。
出于某种原因,您决定智取几代对 SQL 语法非常满意的程序员,并制造难以理解的胡言乱语
$row = selectonerow("some, foo, bar", "baz", "id", [$uniquevalue]);
而不是几乎自然的英语
$row = selectonerow("SELECT some, foo, bar FROM baz WHERE id=?", [$uniquevalue]);
来吧。这不值得。
让你的函数接受常规的 SQL 查询,而不是有限的难以理解的混乱。
function selectonerow(mysqli $conn, string $sql, array $params = []): array
{
if ($params) {
$stmt = $conn->prepare($sql);
$stmt = $mysqli->prepare($sql);
$stmt->bind_param(str_repeat("s", count($params), ...$params);
$stmt->execute();
$result = $stmt->get_result()
} else {
$result = $conn->query($sql);
}
return $result->fetch_assoc();
}
此功能将允许您使用任何查询。例如,需要一个最高价格的行吗?
$row = selectonerow("SELECT * FROM baz ORDER BY price DESC LIMIT 1");
需要更复杂的条件?没问题
$sql = "SELECT * FROM baz WHERE email=? AND activated > ?";
$row = selectonerow($sql, [$email, $date]);
等等。任何 SQL。任何条件。
TA贡献1852条经验 获得超1个赞
我建议去掉这个函数或者用 YCS 建议的函数替换它。
如果您真的想继续使用此功能,请考虑以下修复。您使里面的代码变得非常复杂,并且忘记将连接变量传递给函数。我已经简化了它:
// open the DB connection properly inside Connections/connAsh.php
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$connAsh = new mysqli('host', 'user', 'pass', $database_connAsh);
$connAsh->set_charset('utf8mb4');
// your function:
function selectonerow(mysqli $connAsh, $fieldsarray, $table, $uniquefield, $uniquevalue): array
{
//The required fields can be passed as an array with the field names or as a comma separated value string
if (is_array($fieldsarray)) {
$fields = implode(", ", $fieldsarray);
} else {
$fields = $fieldsarray;
}
//performs the query
$stmt = $connAsh->prepare("SELECT $fields FROM $table WHERE $uniquefield = ?");
$stmt->bind_param('s', $uniquevalue);
$stmt->execute();
return $stmt->get_result()->fetch_assoc();
}
这是您的功能,但消除了很多噪音。我$connAsh在函数的签名中添加了,所以你每次调用这个函数时都必须传入它。该函数将始终返回一个数组;如果没有获取记录,则数组将为空。这是推荐的方式。还要记住始终使用准备好的语句!
- 2 回答
- 0 关注
- 100 浏览
添加回答
举报