打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
php – 如何从Database中回显具有特定变量的行

所以首先我的数据库表设置如下:

id | affsub | offer_name | date | time | payout

1 | stringhere | offer | 2017-09-12 | 06:47:00 | 1

我想将包含affsub stringhere的所有行回显到html表中.我试过这个:

<?php   $id = $get_info_id;   $mysqli = new \mysqli('localhost', 'user', 'pass', 'db');   $aff = $mysqli->query("SELECT affsub FROM users WHERE id = $id")->fetch_object()->affsub;   $affsub = $aff;   $userinfo= $mysqli->query("SELECT offer_name, time, payout FROM conversions WHERE affsub = ". $affsub . "");  if ($userinfo->num_rows > 0) {     while($row = $userinfo->fetch_assoc()) {        echo '<tr>           <td><b><color=black>' .$row['offer_name'].' </b></td>           <td><color=black>' .$row['time'].'</td>           <td>$<color=black>' .$row['payout'].'</td>        </tr>';     }  }  else {     echo "<b><center>No Conversions Have Happened.</center></b>";  }?>

而且我知道它正在得到affsub,因为如果我回复$affsub我的affsub被呼出,但桌子上没有显示任何东西,我不知道发生了什么.

解决方法:

请注意,我使用的sql语句的信用属于@Barmar,因为他昨天首先想到了加入的查询.

现在,下面是两种使用方法.请注意,我没有使用任何OOP或函数.原因是我想让你对所有步骤都有一个简洁的视图.

如何使用mysqli预处理语句和异常处理

1.使用get_result()fetch_object()或fetch_array()或fetch_all():

此方法(推荐)仅在安装/激活驱动程序mysqlnd(MySQL本机驱动程序)时有效.我认为驱动程序默认在PHP> = 5.3中激活.实现代码并让它运行.它应该工作.如果它有效,那么它是完美的.如果没有,请尝试激活mysqlnd驱动程序,例如在php.ini中取消注释extension = php_mysqli_mysqlnd.dll.否则,您必须使用第二种方法(2).

<?php/* * Define constants for db connection. */define('MYSQL_HOST', '...');define('MYSQL_PORT', '...');define('MYSQL_DATABASE', '...');define('MYSQL_CHARSET', 'utf8');define('MYSQL_USERNAME', '...');define('MYSQL_PASSWORD', '...');/* * Activate PHP error reporting. * Use ONLY on development code, NEVER on production code!!! * ALWAYS resolve WARNINGS and ERRORS. * I recommend to always resolve NOTICES too. */error_reporting(E_ALL);ini_set('display_errors', 1);/* * Enable internal report functions. This enables the exception handling,  * e.g. mysqli will not throw PHP warnings anymore, but mysqli exceptions  * (mysqli_sql_exception). They are catched in the try-catch block. *  * MYSQLI_REPORT_ERROR: Report errors from mysqli function calls. * MYSQLI_REPORT_STRICT: Throw a mysqli_sql_exception for errors instead of warnings.  *  * See: *      http://php.net/manual/en/class.mysqli-driver.php *      http://php.net/manual/en/mysqli-driver.report-mode.php *      http://php.net/manual/en/mysqli.constants.php */$mysqliDriver = new mysqli_driver();$mysqliDriver->report_mode = (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);try {    // To delete (just for test here).    $get_info_id = 1;    $userId = $get_info_id;    $fetchedData = array();    /*     * Create the db connection.     *      * Throws mysqli_sql_exception.     * See: http://php.net/manual/en/mysqli.construct.php     */    $connection = new mysqli(            MYSQL_HOST            , MYSQL_USERNAME            , MYSQL_PASSWORD            , MYSQL_DATABASE            , MYSQL_PORT    );    if ($connection->connect_error) {        throw new Exception('Connect error: ' . $connection->connect_errno . ' - ' . $connection->connect_error);    }    /*     * The SQL statement to be prepared. Notice the so-called markers,      * e.g. the "?" signs. They will be replaced later with the      * corresponding values when using mysqli_stmt::bind_param.     *      * See: http://php.net/manual/en/mysqli.prepare.php     */    $sql = 'SELECT                 cnv.offer_name,                 cnv.time,                 cnv.payout             FROM conversions AS cnv            LEFT JOIN users AS usr ON usr.affsub = cnv.affsub             WHERE usr.id = ?';    /*     * Prepare the SQL statement for execution.     *      * Throws mysqli_sql_exception.     * See: http://php.net/manual/en/mysqli.prepare.php     */    $statement = $connection->prepare($sql);    if (!$statement) {        throw new Exception('Prepare error: ' . $connection->errno . ' - ' . $connection->error);    }    /*     * Bind variables for the parameter markers (?) in the      * SQL statement that was passed to mysqli::prepare. The first      * argument of mysqli_stmt::bind_param is a string that contains one      * or more characters which specify the types for the corresponding bind variables.     *      * See: http://php.net/manual/en/mysqli-stmt.bind-param.php     */    $bound = $statement->bind_param('i', $userId);    if (!$bound) {        throw new Exception('Bind error: The variables could not be bound to the prepared statement');    }    /*     * Execute the prepared SQL statement.     * When executed any parameter markers which exist will      * automatically be replaced with the appropriate data.     *      * See: http://php.net/manual/en/mysqli-stmt.execute.php     */    $executed = $statement->execute();    if (!$executed) {        throw new Exception('Execute error: The prepared statement could not be executed!');    }    /*     * Get the result set from the prepared statement. In case of      * failure use errno, error and/or error_list to see the error.     *      * 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.     *      * See:     *      http://php.net/manual/en/mysqli-stmt.get-result.php     *      https://stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result     */    $result = $statement->get_result();    if (!$result) {        throw new Exception('Get result error: ' . $connection->errno . ' - ' . $connection->error);    }    /*     * Get the number of rows in the result.     *      * See: http://php.net/manual/en/mysqli-result.num-rows.php     */    $numberOfRows = $result->num_rows;    /*     * Fetch data and save it into $fetchedData array.     *      * See: http://php.net/manual/en/mysqli-result.fetch-array.php     */    if ($numberOfRows > 0) {        /*         * Use mysqli_result::fetch_object to fetch a row - as object -          * at a time. E.g. use it in a loop construct like 'while'.         */        while ($row = $result->fetch_object()) {            $fetchedData[] = $row;        }    }    /*     * Free the memory associated with the result. You should      * always free your result when it is not needed anymore.     *      * See: http://php.net/manual/en/mysqli-result.free.php     */    $result->close();    /*     * Close the prepared statement. It also deallocates the statement handle.     * If the statement has pending or unread results, it cancels them      * so that the next query can be executed.     *      * See: http://php.net/manual/en/mysqli-stmt.close.php     */    $statementClosed = $statement->close();    if (!$statementClosed) {        throw new Exception('The prepared statement could not be closed!');    }    // Close db connection.    $connectionClosed = $connection->close();    if (!$connectionClosed) {        throw new Exception('The db connection could not be closed!');    }} catch (mysqli_sql_exception $e) {    echo 'Error: ' . $e->getCode() . ' - ' . $e->getMessage();    exit();} catch (Exception $e) {    echo $e->getMessage();    exit();}/* * Disable internal report functions. *  * MYSQLI_REPORT_OFF: Turns reporting off. *  * See: *      http://php.net/manual/en/class.mysqli-driver.php *      http://php.net/manual/en/mysqli-driver.report-mode.php *      http://php.net/manual/en/mysqli.constants.php */$mysqliDriver->report_mode = MYSQLI_REPORT_OFF;?><!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title>Example code: Mysqli prepared statements & exception handling</title>    </head>    <style>        table {            font-family: "Verdana", Arial, sans-serif;            font-size: 14px;            border-collapse: collapse;        }        table, th, td {            border: 1px solid #ccc;        }        th, td {            padding: 7px;        }        thead {            color: #fff;            font-weight: normal;            background-color: coral;        }        tfoot {            background-color: wheat;        }        tfoot td {            text-align: right;        }    </style>    <body>        <?php        $countOfFetchedData = count($fetchedData);        if ($countOfFetchedData > 0) {            ?>            <table>                <thead>                    <tr>                        <th>Crt. No.</th>                        <th>OFFER NAME</th>                        <th>TIME</th>                        <th>PAYOUT</th>                    </tr>                </thead>                <tbody>                    <?php                    foreach ($fetchedData as $key => $item) {                        $offerName = $item->offer_name;                        $time = $item->time;                        $payout = $item->payout;                        ?>                        <tr>                            <td><?php echo $key   1; ?></td>                            <td><?php echo $offerName; ?></td>                            <td><?php echo $time; ?></td>                            <td><?php echo $payout; ?></td>                        </tr>                        <?php                    }                    ?>                </tbody>                <tfoot>                    <tr>                        <td colspan="7">                            - <?php echo $countOfFetchedData; ?> records found -                        </td>                    </tr>                </tfoot>            </table>            <?php        } else {            ?>            <span>                No records found.            </span>            <?php        }        ?>    </body></html>

注意:如何使用fetch_array()而不是fetch_object():

//...if ($numberOfRows > 0) {    /*     * Use mysqli_result::fetch_array to fetch a row at a time.     * e.g. use it in a loop construct like 'while'.     */    while ($row = $result->fetch_array(MYSQLI_ASSOC)) {        $fetchedData[] = $row;    }}//...

在html代码中进行相应的更改.

注意:如何使用fetch_all()而不是fetch_object():

//...if ($numberOfRows > 0) {    /*     * Use mysqli_result::fetch_all to fetch all rows at once.     */    $fetchedData = $result->fetch_all(MYSQLI_ASSOC);}//...

在html代码中进行相应的更改.

2.使用store_result()bind_result()fetch():

没有驱动程序mysqlnd(MySQL本机驱动程序)的工作.

<?php/* * Define constants for db connection. */define('MYSQL_HOST', '...');define('MYSQL_PORT', '...');define('MYSQL_DATABASE', '...');define('MYSQL_CHARSET', 'utf8');define('MYSQL_USERNAME', '...');define('MYSQL_PASSWORD', '...');/* * Activate PHP error reporting. * Use ONLY on development code, NEVER on production code!!! * ALWAYS resolve WARNINGS and ERRORS. * I recommend to always resolve NOTICES too. */error_reporting(E_ALL);ini_set('display_errors', 1);/* * Enable internal report functions. This enables the exception handling,  * e.g. mysqli will not throw PHP warnings anymore, but mysqli exceptions  * (mysqli_sql_exception). They are catched in the try-catch block. *  * MYSQLI_REPORT_ERROR: Report errors from mysqli function calls. * MYSQLI_REPORT_STRICT: Throw a mysqli_sql_exception for errors instead of warnings.  *  * See: *      http://php.net/manual/en/class.mysqli-driver.php *      http://php.net/manual/en/mysqli-driver.report-mode.php *      http://php.net/manual/en/mysqli.constants.php */$mysqliDriver = new mysqli_driver();$mysqliDriver->report_mode = (MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);try {    // To delete (just for test here).    $get_info_id = 1;    $userId = $get_info_id;    $fetchedData = array();    /*     * Create the db connection.     *      * Throws mysqli_sql_exception.     * See: http://php.net/manual/en/mysqli.construct.php     */    $connection = new mysqli(            MYSQL_HOST            , MYSQL_USERNAME            , MYSQL_PASSWORD            , MYSQL_DATABASE            , MYSQL_PORT    );    if ($connection->connect_error) {        throw new Exception('Connect error: ' . $connection->connect_errno . ' - ' . $connection->connect_error);    }    /*     * The SQL statement to be prepared. Notice the so-called markers,      * e.g. the "?" signs. They will be replaced later with the      * corresponding values when using mysqli_stmt::bind_param.     *      * See: http://php.net/manual/en/mysqli.prepare.php     */    $sql = 'SELECT                 cnv.offer_name,                 cnv.time,                 cnv.payout             FROM conversions AS cnv            LEFT JOIN users AS usr ON usr.affsub = cnv.affsub             WHERE usr.id = ?';    /*     * Prepare the SQL statement for execution.     *      * Throws mysqli_sql_exception.     * See: http://php.net/manual/en/mysqli.prepare.php     */    $statement = $connection->prepare($sql);    if (!$statement) {        throw new Exception('Prepare error: ' . $connection->errno . ' - ' . $connection->error);    }    /*     * Bind variables for the parameter markers (?) in the      * SQL statement that was passed to mysqli::prepare. The first      * argument of mysqli_stmt::bind_param is a string that contains one      * or more characters which specify the types for the corresponding bind variables.     *      * See: http://php.net/manual/en/mysqli-stmt.bind-param.php     */    $bound = $statement->bind_param('i', $userId);    if (!$bound) {        throw new Exception('Bind error: The variables could not be bound to the prepared statement');    }    /*     * Execute the prepared SQL statement.     * When executed any parameter markers which exist will      * automatically be replaced with the appropriate data.     *      * See: http://php.net/manual/en/mysqli-stmt.execute.php     */    $executed = $statement->execute();    if (!$executed) {        throw new Exception('Execute error: The prepared statement could not be executed!');    }    /*     * Transfer the result set resulted from executing the prepared statement.     * E.g. store, e.g. buffer the result set into the (same) prepared statement.     *      * See:     *      http://php.net/manual/en/mysqli-stmt.store-result.php     *      https://stackoverflow.com/questions/8321096/call-to-undefined-method-mysqli-stmtget-result     */    $resultStored = $statement->store_result();    if (!$resultStored) {        throw new Exception('Store result error: The result set  could not be transfered');    }    /*     * Get the number of rows from the prepared statement.     *      * See: http://php.net/manual/en/mysqli-stmt.num-rows.php     */    $numberOfRows = $statement->num_rows;    /*     * Fetch data and save it into $fetchedData array.     *      * See: http://php.net/manual/en/mysqli-result.fetch-array.php     */    if ($numberOfRows > 0) {        /*         * Bind the result set columns to corresponding variables.         * E.g. these variables will hold the column values after fetching.         *          * See: http://php.net/manual/en/mysqli-stmt.bind-result.php         */        $varsBound = $statement->bind_result(                $resOfferName                , $resTime                , $resPayout        );        if (!$varsBound) {            throw new Exception('Bind result error: The result set columns could not be bound to variables');        }        /*         * Fetch results from the result set (of the prepared statement) into the bound variables.         *          * See: http://php.net/manual/en/mysqli-stmt.fetch.php         */        while ($row = $statement->fetch()) {            $fetchedObject = new stdClass();            $fetchedObject->offer_name = $resOfferName;            $fetchedObject->time = $resTime;            $fetchedObject->payout = $resPayout;            $fetchedData[] = $fetchedObject;        }    }    /*     * Frees the result memory associated with the statement,     * which was allocated by mysqli_stmt::store_result.     *      * See: http://php.net/manual/en/mysqli-stmt.store-result.php     */    $statement->free_result();    /*     * Close the prepared statement. It also deallocates the statement handle.     * If the statement has pending or unread results, it cancels them      * so that the next query can be executed.     *      * See: http://php.net/manual/en/mysqli-stmt.close.php     */    $statementClosed = $statement->close();    if (!$statementClosed) {        throw new Exception('The prepared statement could not be closed!');    }    // Close db connection.    $connectionClosed = $connection->close();    if (!$connectionClosed) {        throw new Exception('The db connection could not be closed!');    }} catch (mysqli_sql_exception $e) {    echo 'Error: ' . $e->getCode() . ' - ' . $e->getMessage();    exit();} catch (Exception $e) {    echo $e->getMessage();    exit();}/* * Disable internal report functions. *  * MYSQLI_REPORT_OFF: Turns reporting off. *  * See: *      http://php.net/manual/en/class.mysqli-driver.php *      http://php.net/manual/en/mysqli-driver.report-mode.php *      http://php.net/manual/en/mysqli.constants.php */$mysqliDriver->report_mode = MYSQLI_REPORT_OFF;?><!DOCTYPE html><html>    <head>        <meta charset="UTF-8">        <title>Example code: Mysqli prepared statements & exception handling</title>    </head>    <style>        table {            font-family: "Verdana", Arial, sans-serif;            font-size: 14px;            border-collapse: collapse;        }        table, th, td {            border: 1px solid #ccc;        }        th, td {            padding: 7px;        }        thead {            color: #fff;            font-weight: normal;            background-color: coral;        }        tfoot {            background-color: wheat;        }        tfoot td {            text-align: right;        }    </style>    <body>        <?php        $countOfFetchedData = count($fetchedData);        if ($countOfFetchedData > 0) {            ?>            <table>                <thead>                    <tr>                        <th>Crt. No.</th>                        <th>OFFER NAME</th>                        <th>TIME</th>                        <th>PAYOUT</th>                    </tr>                </thead>                <tbody>                    <?php                    foreach ($fetchedData as $key => $item) {                        $offerName = $item->offer_name;                        $time = $item->time;                        $payout = $item->payout;                        ?>                        <tr>                            <td><?php echo $key   1; ?></td>                            <td><?php echo $offerName; ?></td>                            <td><?php echo $time; ?></td>                            <td><?php echo $payout; ?></td>                        </tr>                        <?php                    }                    ?>                </tbody>                <tfoot>                    <tr>                        <td colspan="7">                            - <?php echo $countOfFetchedData; ?> records found -                        </td>                    </tr>                </tfoot>            </table>            <?php        } else {            ?>            <span>                No records found.            </span>            <?php        }        ?>    </body></html>

最后,我建议你使用面向对象的方法,比如实现MySQLiConnection类(用于处理数据库连接)和MySQLiAdapter类(用于处理查询功能).这两个类只应实例化一次. MySQLiConnection应作为构造函数参数传递给MySQLiAdapter类. MySQLiAdapter类需要一个MySQLiConnection类来查询数据库并接收结果.您也可以通过实现相应的接口来扩展它们的使用,但我试图让我的解释变得简单.

我还建议您使用PDO而不是MySQLi.我在实现此代码时发现的原因之一:MySQLi中具有一定挑战性的异常处理系统.

祝好运!

来源:https://www.icode9.com/content-1-483051.html
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
php在mysql操作buffer的方法
PHP操作mysql(mysqli + PDO)
PHP访问MySQL数据库的几种方法(转)
MySQL丨PHP 获取查询结果
PHP连接MySQL数据库并以json格式输出
《PHP+MySQL动态网站开发实例教程》第8章 PHP操作MySQL数据库
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服