【问题标题】:Use fetch_column and fetch(PDO::FETCH_ASSOC) together?一起使用 fetch_column 和 fetch(PDO::FETCH_ASSOC) ?
【发布时间】:2013-05-28 16:51:55
【问题描述】:

我承认 php 对我来说是一门新语言。

现在我可以让这些中的每一个单独工作。在我的准备查询中 SELECT * FROM... 将允许我的 PDO fetch assoc while 循环工作,但随后 fetch 列不起作用。然后我使用 SELECT COUNT(*) 我的 fetch 列有效,但我的 fetch assoc 却没有。

那么这附近有没有这样两个都可以工作的地方?因为我需要 fetch 列以整数值(1 或 0)的形式返回有多少行,以确定用户是否输入了登录信息。但是我需要在那里获取列来返回在我的数据库表的用户名部分中输入的字符串值。这样我就可以使用这些信息来检查它与用户输入的内容是否相符,以验证用户和密码。

谢谢,这是我的代码。如果您需要更清楚地解释,我会去。

<?php
$config['db'] = array(
    'host'      => 'localhost',
    'username'  => 'root',
    'password'  => '',
    'dbname'    => 'inb271assignment'
);

$pdo = new PDO('mysql:host=' . $config['db']['host'] . '; dbname=' . $config['db']['dbname'], $config['db']['username'], $config['db']['password']);

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
try
{
    $pdo->beginTransaction();

    $username = $_POST['Username'];
    $password = $_POST['Password'];

                        //Nicholas will be $dbUsername when fetch is working correctly.
    $databaseusername = Nicholas;

    if ($username&&$password)
    {
        $result = $pdo->prepare("SELECT COUNT(*) FROM members WHERE Username=?");
        $result->execute(array($databaseusername));

        $row = $result->fetchColumn();

        if ($row!=0) {

            while ($rows = $result->fetch(PDO::FETCH_ASSOC)) {

                $dbUsername = $rows['Username']; 


            }
            echo $dbUsername;

        }
        else
            die("That user doesn't exist");

    }

   $pdo->commit();
}
catch(PDOException $pe)
{
    echo($pe->getMessage());
}
?>

所以目前我在那里有 SELECT COUNT(*)。因此,如果我在页面上的表单中输入用户名和密码,它将返回为 !=0 允许 while 循环工作。如果我有 SELECT *,while 循环通常可以工作。但是因为我不需要,因为我不需要计数。所以我无法从数据库中检索到我需要的信息。

【问题讨论】:

  • 为什么需要count(*)
  • 如果我不包含它,那么 fetchColumn() 不起作用。所以目前我可以得到我需要展示的两件事中的一件。只是不能同时。现在打算试试 Fabio 的方法。

标签: php mysql pdo fetch


【解决方案1】:

照常使用SELECT * FROM ...和PDO fetch assoc,使用$result-&gt;rowCount();返回所有受影响的行,相当于SELECT COUNT(*)

【讨论】:

    【解决方案2】:

    如果您使用count(*) 查询只是为了找出数据库中是否存在具有给定用户名的用户,那么您不需要它。您可以改为获取第一行,如果它为空,则没有用户,否则至少有一个。所以你隐含了你的信息。

    $rowNum = 0;
    foreach ($result->fetchAll(PDO::FETCH_ASSOC) as $row) {
      $rowNum = $rowNum + 1;
       $dbUsername = $row['Username']; // btw after the loop you have only the name of the last row
    }
    if ($row>0) {
        echo $dbUsername;
    }
    

    【讨论】:

      【解决方案3】:

      首先您需要了解您使用的每个运算符的含义。
      然后巧妙地使用它,仅在需要时使用,而不是仅仅因为您在某处看到它们使用过而添加任何运算符。

      事实上,您既不需要COUNT(*),也不需要rowCount(),也不需要while。应该只返回一行。够了。

      Transaction 和 try..catch 也很重要。

      您真正需要的只是几行代码:

      if (isset($_POST['Username']))
      {
          $sql = "SELECT * FROM members WHERE Username=? AND Password=?";
          $result = $pdo->prepare($sql);
          $result->execute(array($_POST['Username'],$_POST['Password']));
          return $result->fetch();
          // or do whatever you want with returned data
      }
      

      这就是全部

      【讨论】:

        【解决方案4】:

        登录的例子有一个很大的缺陷,它从$_POST中挑选密码,直接向mysql查询。

        这意味着密码在数据库中是明确的。

        要应用最佳实践,您应该对密码进行哈希+加盐并加密所有个人数据。

        关于如何做的很好的概述:

        http://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/

        【讨论】:

          猜你喜欢
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-16
          • 1970-01-01
          • 1970-01-01
          • 2016-05-28
          相关资源
          最近更新 更多