【问题标题】:Switching Object Oriented mysqli to Procedural将面向对象的 mysqli 切换到过程化
【发布时间】:2021-12-03 07:15:06
【问题描述】:
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_prepare,以便您可以正确复制 OO 代码。
  • 我会借此机会学习 OOP 语法...
  • @NigelRen 我尝试使用 Php 文档来学习 mysqli_prepare,但是当我尝试按照文档中的步骤进行操作时,我感到更加困惑。 @ADyson 我想如果我想使用它,我必须学习 OOP 语法。我上周刚开始学习程序,直到课程结束后我才知道有不同的方法。感谢您的提示
  • I tried using the Php docs to learn the mysqli_prepare but I got confused more when I tried following the steps...在这种情况下,您实际上只需将 OOP 版本中的命令替换为手册中所示的每个命令的等效程序即可。你可以一行一行地做。但我不会打扰 - 从长远来看,OOP 更容易理解,并产生更易于维护的代码。值得努力去理解这一点。
  • 如果你刚刚开始学习 PHP,那么你应该学习 PDO 而不是 mysqli。 PDO 更容易,更适合初学者。从这里开始phpdelusions.net/pdo & websitebeaver.com/…

标签: php mysqli


【解决方案1】:

不要那样做。绝对没有理由使用程序 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);

【讨论】:

  • 感谢@Dharman 一定会查看 PDO 文档。我花钱买的php教程只在mysqli里教过,我想是时候升级了。
  • 如果您支付了教您 mysqli 的教程费用,我会考虑退款。听起来很糟糕
  • 在udemy上。我想我刚开始学习一门新语言时运气不好。很高兴我在对成为一名 php 程序员充满信心之前得到了很好的建议。
猜你喜欢
  • 2010-12-13
  • 1970-01-01
  • 2017-06-04
  • 2013-03-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-27
相关资源
最近更新 更多