Advertencia de PHP: mysqli_num_rows() espera que el parámetro 1 sea mysqli_result, objeto dado

5 minutos de lectura

avatar de usuario
confortchambeshi

Estoy tratando de hacer algunas declaraciones preparadas usando la palabra clave LIKE en sql pero me está dando:

Advertencia: mysqli_num_rows() espera que el parámetro 1 sea mysqli_result, objeto dado

código 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']);

}

formulario de búsqueda 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>

  • No puedo ver esa función en ninguna parte de tu código.

    – Sombra

    15 de agosto de 2020 a las 19:21

  • ¿Qué función?

    – comfortchambeshi

    15 de agosto de 2020 a las 19:22

  • El que hace referencia el mensaje de error.

    – Sombra

    15 de agosto de 2020 a las 19:23

  • OK he editado mi código

    – comfortchambeshi

    15 de agosto de 2020 a las 19:25

  • ¿Por qué usas mysqli_real_escape_string?

    – Darman

    15 de agosto de 2020 a las 19:49

avatar de usuario
dakis

El problema:

El método mysqli::preparar devuelve una instancia de la mysqli_stmt clase, por ejemplo, un declaración preparada objeto. Pero la función procesal mysqli_num_rows requiere un objeto de tipo mysqli_result como argumento, por ejemplo, un conjunto resultante objeto.

La solución:

Entonces, para poder llamar correctamente a la función mysqli_num_rowsprimero tendrás que buscar un conjunto resultante desde el declaración preparada llamando al método $stmt::get_result. El objeto del conjunto de resultados ($result) se puede pasar como argumento a 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'];

            //...
        }
    }
}

Solución alternativa:

<?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>

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad