2 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
原來(lái)的功能在很多層面上都是錯(cuò)誤的。重新創(chuàng)建它的功能是沒(méi)有意義的。
基本上你在這里討價(jià)還價(jià)的只是幾個(gè) SQL 關(guān)鍵字。但這些關(guān)鍵字有助于提高可讀性。
出于某種原因,您決定智取幾代對(duì) SQL 語(yǔ)法非常滿(mǎn)意的程序員,并制造難以理解的胡言亂語(yǔ)
$row = selectonerow("some, foo, bar", "baz", "id", [$uniquevalue]);
而不是幾乎自然的英語(yǔ)
$row = selectonerow("SELECT some, foo, bar FROM baz WHERE id=?", [$uniquevalue]);
來(lái)吧。這不值得。
讓你的函數(shù)接受常規(guī)的 SQL 查詢(xún),而不是有限的難以理解的混亂。
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();
}
此功能將允許您使用任何查詢(xún)。例如,需要一個(gè)最高價(jià)格的行嗎?
$row = selectonerow("SELECT * FROM baz ORDER BY price DESC LIMIT 1");
需要更復(fù)雜的條件?沒(méi)問(wèn)題
$sql = "SELECT * FROM baz WHERE email=? AND activated > ?";
$row = selectonerow($sql, [$email, $date]);
等等。任何 SQL。任何條件。

TA貢獻(xiàn)1852條經(jīng)驗(yàn) 獲得超1個(gè)贊
我建議去掉這個(gè)函數(shù)或者用 YCS 建議的函數(shù)替換它。
如果您真的想繼續(xù)使用此功能,請(qǐng)考慮以下修復(fù)。您使里面的代碼變得非常復(fù)雜,并且忘記將連接變量傳遞給函數(shù)。我已經(jīng)簡(jiǎn)化了它:
// 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在函數(shù)的簽名中添加了,所以你每次調(diào)用這個(gè)函數(shù)時(shí)都必須傳入它。該函數(shù)將始終返回一個(gè)數(shù)組;如果沒(méi)有獲取記錄,則數(shù)組將為空。這是推薦的方式。還要記住始終使用準(zhǔn)備好的語(yǔ)句!
- 2 回答
- 0 關(guān)注
- 128 瀏覽
添加回答
舉報(bào)