dongpa6867 2014-01-14 11:46
浏览 40
已采纳

PHP - MySQLi准备语句

$name = $_GET['user'];
if(isset($_GET['user']) && strlen($_GET['user'])>0) {
    $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
    $stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?");
    $stmt->bind_param('s', $name);
    $stmt->execute();
    while($stmt->fetch()) {
        if($stmt->num_rows == 0) {
            header("Location: home?errormsg=notfound");
            exit();
        }
    }
    $stmt->store_result();
    $stmt->close();
}
$mysqli->close();

So, the above code checks if $_GET['name'] exists in the database, and if it doesn't, to redirect to home?errormsg=notfound but it redirects the usernames which exists in the database to the link 'home?errormsg=notfound' as well. Can you suggest a way to solve this problem?

  • 写回答

2条回答 默认 最新

  • dspvin19712 2014-01-14 11:59
    关注

    You have to call $stmt->store_result() before $stmt->num_rows.

    And your $stmt->fetch() is not necessary, because you don't use the selected data.

    If you call store_result() after num_rows it won't work.

    Part of comment from manual page:

    If you do not use mysqli_stmt_store_result( ), and immediatley call this function after executing a prepared statement, this function will usually return 0 as it has no way to know how many rows are in the result set as the result set is not saved in memory yet.

    So your code should look like this:

    $name = $_GET['user'];
    if(isset($_GET['user']) && strlen($_GET['user'])>0) {
        $mysqli = new mysqli($dbhost, $dbuser, $dbpass, $db);
        $stmt = $mysqli->prepare("SELECT username FROM users WHERE username=?");
        $stmt->bind_param('s', $name);
        $stmt->execute();
        $stmt->store_result();
        if($stmt->num_rows == 0) {
            header("Location: home?errormsg=notfound");
            exit();
        }
        $stmt->close();
    }
    $mysqli->close();
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥100 支付宝网页转账系统不识别账号
  • ¥15 基于单片机的靶位控制系统
  • ¥15 AT89C51控制8位八段数码管显示时钟。
  • ¥15 真我手机蓝牙传输进度消息被关闭了,怎么打开?(关键词-消息通知)
  • ¥15 下图接收小电路,谁知道原理
  • ¥15 装 pytorch 的时候出了好多问题,遇到这种情况怎么处理?
  • ¥20 IOS游览器某宝手机网页版自动立即购买JavaScript脚本
  • ¥15 手机接入宽带网线,如何释放宽带全部速度
  • ¥30 关于#r语言#的问题:如何对R语言中mfgarch包中构建的garch-midas模型进行样本内长期波动率预测和样本外长期波动率预测
  • ¥15 ETLCloud 处理json多层级问题