将面向对象的mysqli切换为过程的


function build_calendar($month, $year){
$mysqli = new mysqli('localhost', 'root', '', 'ems');
$stmt = $mysqli->prepare("SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");
$stmt->bind_param('ss', $month, $year);
$bookings = array();
if($stmt->execute()){
$result = $stmt->get_result();
if($result->num_rows>0){
while($row = $result->fetch_assoc()){
$bookings[] = $row['event_date'];
}
$stmt->close();
}
}

我写下这段代码是为了修复从数据库中获取预订日期并将其显示在日历上的问题,但我还不是OOP的人,我很想用我仍然更理解的过程格式来使用这种语法。

我已经试过了

$connection = mysqli_connect('localhost', 'root', '', 'ems');
$query = "SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?";
$get_dates = mysqli_query($connection, $query);
while($row = mysqli_fetch_assoc($get_dates)){
$booked_dates[] = $row['event_date'];
}

但这会返回一个错误:

致命错误:未捕获类型错误:mysqli_fetch_assoc((:参数#1($result(的类型必须为mysqli_result

不要那样做。绝对没有理由使用程序性的mysqli风格。它的设计只是为了帮助人们从PHP 4代码中迁移。您不应该在新的代码库中使用它。

此外,在OO风格中使用mysqli并不会使您的代码成为OOP,您甚至不需要知道OOP就可以在OO风格下使用mysqli。

如果你想知道过程式和OO风格的mysqli之间的区别,那只是函数的名称不同,你必须将对象作为第一个参数传递。

这意味着这些是等效的:

$stmt = $mysqli->prepare("SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");
$stmt = mysqli_prepare($mysqli, "SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");

转换为过程mysqli的函数看起来仍然相同:

function build_calendar($month, $year)
{
$mysqli = mysqli_connect('localhost', 'root', '', 'ems');
$stmt = mysqli_prepare($mysqli, "SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");
mysqli_stmt_bind_param($stmt, 'ss', $month, $year);
$bookings = array();
if (mysqli_stmt_execute($stmt)) {
$result = mysqli_stmt_get_result($stmt);
if (mysqli_num_rows($result) > 0) {
while ($row = mysqli_fetch_assoc($result)) {
$bookings[] = $row['event_date'];
}
mysqli_stmt_close($stmt);
}
}
}

然而,通过学习mysqli,你学到了很多糟糕的实践,因为那里有糟糕的教程。我强烈建议学习PDO。如果你真的想忍受mysqli的痛苦,那么你至少可以简化代码:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'root', '', 'ems');
function build_calendar(mysqli $mysqli, $month, $year): array
{
$stmt = $mysqli->prepare("SELECT * FROM bookings WHERE MONTH(event_date) = ? AND YEAR(event_date)=?");
$stmt->bind_param('ss', $month, $year);
$stmt->execute();
$result = $stmt->get_result();
return $result->fetch_all(MYSQLI_ASSOC);
}
$bookings = build_calendar($mysqli, 1, 2020);

最新更新