PHP警告:mysqli_num_row()要求参数1为mysqli_Result,给出了对象

2022-07-23 00:00:00 php mysqli

我试图在SQL中使用LIKE关键字创建一些准备好的语句,但结果是:

警告 :mysqli_num_row()要求参数1为mySQLI_RESULT,给定对象

PHP代码:

if(isset($_POST['search_acc'])){
                            $p = $_POST['search_text'];
                            $search_text = "%p%";
                            
                            $stmt = $conn->prepare("SELECT * FROM accountants WHERE name LIKE ? ");
                            $stmt->bind_param("s",$search_text);
                            $stmt->execute();
                            
                        }



if (mysqli_num_rows($stmt) > 0) {
                                while ($RowaccountantsList = mysqli_fetch_assoc($stmt)) {
                                    $accountantFullName = mysqli_real_escape_string($conn, $RowaccountantsList['name']);
                                    $accountantId = mysqli_real_escape_string($conn, $RowaccountantsList['ts_number']);
                                    $accountantCityTown = mysqli_real_escape_string($conn, $RowaccountantsList['city_town']);
                                    $DB_id = mysqli_real_escape_string($conn, $RowaccountantsList['id']);
                                    $nrc = mysqli_real_escape_string($conn, $RowaccountantsList['nrc']);
                                    $profile_pic = mysqli_real_escape_string($conn, $RowaccountantsList['profile_pic']);
                                    $RegisteredDate = mysqli_real_escape_string($conn, $RowaccountantsList['registered_date']);

}

html搜索表单:

<form method="post" action="">
        <div id="custom-search-input">
            <div class="input-group col-md-12 align-center">
                <input name="search_text" type="text" class="form-control input-lg" placeholder="Enter email, phone or username" />
                <span class="input-group-btn">
                    <button name="search_acc" class="btn btn-info btn-lg" type="submit">
                        <i class="fa fa-search" aria-hidden="true"></i>
                    </button>
                </span>
            </div>
        </div>
    </div>
    </form>

解决方案

问题:

方法mysqli::prepare返回mysqli_stmt类的实例,例如准备好的语句对象。但过程函数mysqli_num_rows要求将mysqli_result类型的对象作为参数,例如对象。

解决方案:

因此,为了能够正确调用函数mysqli_num_rows,您必须首先通过调用方法$stmt::get_result从从中获取结果集。然后可以将结果集对象($result)作为参数传递给mysqli_num_rows

<?php

if (isset($_POST['search_acc'])) {
    //...

    $stmt->execute();

    /*
     * Get the result set from the prepared statement.
     *
     * NOTA BENE:
     * Available only with mysqlnd ("MySQL Native Driver")! If this
     * is not installed, then uncomment "extension=php_mysqli_mysqlnd.dll" in
     * PHP config file (php.ini) and restart web server (I assume Apache) and
     * mysql service. Or use the following functions instead:
     * mysqli_stmt::store_result + mysqli_stmt::bind_result + mysqli_stmt::fetch.
     *
     * @link http://php.net/manual/en/mysqli-stmt.get-result.php
     * @link https://stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result
     */
    $result = $stmt->get_result();

    if (mysqli_num_rows($result) > 0) {
        while ($RowaccountantsList = mysqli_fetch_assoc($stmt)) {
            // No need for "mysqli_real_escape_string" anymore, since the SQL statement is prepared using mysqli::prepare.
            $accountantFullName = $RowaccountantsList['name'];

            //...
        }
    }
}

替代解决方案:

<?php
if (isset($_POST['search_acc'])) {
    //...

    $stmt->execute();
    
    $result = $stmt->get_result();

    /*
     * Fetch all data at once and save it into an array.
     *
     * @link http://php.net/manual/en/mysqli-result.fetch-all.php
     */
    $accountants = $result->fetch_all(MYSQLI_ASSOC);

    /*
     * ...or fetch and save one row at a time.
     *
     * @link https://secure.php.net/manual/en/mysqli-result.fetch-array.php
     */
    // while ($accountant = $result->fetch_array(MYSQLI_ASSOC)) {
    //     $accountants[] = $accountant;
    // }
}
?>

<!DOCTYPE html>
<html>
    <head>
        <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" />
        <meta name="viewport" content="width=device-width, initial-scale=1, user-scalable=yes" />
        <meta charset="UTF-8" />
        <!-- The above 3 meta tags must come first in the head -->

        <title>Demo</title>
    </head>
    <body>

        <form method="post" action="">
            <div id="custom-search-input">
                <div class="input-group col-md-12 align-center">
                    <input name="search_text" type="text" class="form-control input-lg" placeholder="Enter email, phone or username" />
                    <span class="input-group-btn">
                        <button name="search_acc" class="btn btn-info btn-lg" type="submit">
                            <i class="fa fa-search" aria-hidden="true"></i>
                        </button>
                    </span>
                </div>
            </div>
        </form>

        <h3>
            Accountants list
        </h3>

        <table class="accountants">
            <thead>
                <tr>
                    <th>ID</th>
                    <th>Full Name</th>
                    <th>City/Town</th>
                    <th>TS Number</th>
                    <th>NRC</th>
                    <th>Profile Picture</th>
                    <th>Registered Date</th>
                </tr>
            </thead>
            <tbody>
                <?php
                if ($accountants) {
                    foreach ($accountants as $accountant) {
                        $id = $accountant['id'];
                        $fullName = $accountant['name'];
                        $cityTown = $accountant['city_town'];
                        $tsNumber = $accountant['ts_number'];
                        $nrc = $accountant['nrc'];
                        $profilePicture = $accountant['profile_pic'];
                        $registeredDate = $accountant['registered_date'];
                        ?>
                        <tr class="accountant">
                            <td><?php echo $id; ?></td>
                            <td><?php echo $fullName; ?></td>
                            <td><?php echo $cityTown; ?></td>
                            <td><?php echo $tsNumber; ?></td>
                            <td><?php echo $nrc; ?></td>
                            <td><?php echo $profilePicture; ?></td>
                            <td><?php echo $registeredDate; ?></td>
                        </tr>
                        <?php
                    }
                } else {
                    ?>
                    <tr>
                        <td colspan="7">
                            No accountants found.
                        </td>
                    </tr>
                    <?php
                }
                ?>
            </tbody>
        </table>

    </body>
</html>

相关文章