【问题标题】:Error in connection database using pdo使用 pdo 连接数据库时出错
【发布时间】:2014-01-28 10:09:49
【问题描述】:

我将简单的 SQL 查询更改为 pdo.now,当我点击登录按钮时,我收到了这个错误:

未定义变量:/var/www/login.php 第 16 行中的行
注意:未定义的变量:导致第 17 行的 /var/www/login.php
警告:mysql_num_rows() 期望参数 1 是资源,在第 17 行的 /var/www/login.php 中给出 null 您的登录名或密码无效

代码:

<?php
    error_reporting(E_ALL);
    ini_set('display_errors','5');
    include("conn.php");
    session_start();
    if($_SERVER["REQUEST_METHOD"] == "POST")
    {
        // username and password sent from Form
        $u_name=addslashes($_POST['username']);
        $password=addslashes($_POST['password']);

        $sql="SELECT id FROM admin WHERE username='$u_name' and password='$password'";
        $q   = $conn->query($sql) or die("failed!");
        $r = $q->fetch(PDO::FETCH_ASSOC);
        $active=$row['active'];
        $count=mysql_num_rows($result);


        // If result matched $myusername and $mypassword, table row must be 1 row
        if($count==1)
        {
            session_register("u_name");
            $_SESSION['login_user']=$u_name;
            header("location: main.php");
        }
        else
        {
              echo ("Your Login Name or Password is invalid");
        }
}
?>

【问题讨论】:

  • 我看不到您在任何地方分配 $result 变量!?
  • 你不能在同一个查询中同时使用 PDO 和 mysql。
  • 不相关,但由于您使用的是 PDO,您可以(并且应该)也使用准备好的语句代替 addslashes()
  • 是的,我知道你能告诉我我应该如何计算我的行数

标签: php


【解决方案1】:

mysql_num_rows 是一个函数,它是 已弃用 mysql_* 扩展的一部分。只需查看 PDO 手册here,看看如何使用 PDO 获取 num-rows。您只是不能随意使用 PDO 和 mysql(i)_* 一起

您的代码中还有很多其他问题,包括查询本身:SELECT id FROM 将返回一个结果集,其中每一行只有一个名为 ID 的列,但您继续访问您的 $row['active'];代码。那会发出通知,因为找不到索引。
根据您在此处的代码,更改查询以选择您实际需要的所有字段SELECT id, active FROM... 是最低要求。

除此之外,就变量名称而言,您也非常不一致。你所谓的$r 会在下一行更改为$row...当然,这就是导致undefined variable 通知的原因。

你还有一个相当大的注入漏洞,我会这样查询你的数据:

$stmt = $conn->prepare('SELECT id, active FROM admin where username = :user AND password = :pass');
$stmt->execute(array(
    ':user' => $_POST['username'],
    ':pass' => $_POST['password']
));
//$rowCount = $stmt->rowCount(); <-- only for update, delete or insert queries
$rowCount = 0;
while($row = $stmt->fetch(PDO::FETCH_ASSOC))
{
    ++$rowCount;//count while fetching
    //process row
}
//or
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
$rowCount = count($rows);
foreach($rows as $row)
{
    //process row
}

也就是说,您确实应该了解准备好的语句并散列您的密码

【讨论】:

  • thnks. 你能推荐我任何网站吗
  • @Mihirshah:为了什么?准备好的语句:都在 php.net 上的链接手册页中:PDO::preparePDOStatement::executePDOStatement::rowCountPDOStatement::fetch 都是方法。关于密码哈希:只需谷歌 PHP 哈希密码(或检查 password_hash 函数,如果您的 PHP 版本允许)
  • 致命错误:在第 14 行的 /var/www/login.php 中调用未定义的方法 PDO::fetch()
  • @Mihirshah: 更新了...请阅读我链接的文档,如果你这样做了,你自己就能弄清楚
  • @Mihirshah:NP,请阅读本网站的帮助部分:您被要求不要发布“谢谢” cmets,而是求助于接受答案(通过单击答案旁边的大检查图标将它们标记为已接受)。作为奖励:如果您这样做,您将获得 2 点声望点
【解决方案2】:

$r = $q-&gt;fetch(PDO::FETCH_ASSOC); 应该是 $row = $q-&gt;fetch(PDO::FETCH_ASSOC);

另外,session_register() 函数已被弃用。你不应该使用它。

【讨论】:

    猜你喜欢
    • 2013-01-26
    • 2017-03-30
    • 1970-01-01
    • 1970-01-01
    • 2012-05-15
    • 2014-10-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多