首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >同时使用fetch_column和fetch(PDO::FETCH_ASSOC)?

同时使用fetch_column和fetch(PDO::FETCH_ASSOC)?
EN

Stack Overflow用户
提问于 2013-06-02 17:29:00
回答 4查看 6.5K关注 0票数 2

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

现在我可以让它们分别工作了。在我的准备查询中,SELECT * FROM...将允许我的PDO fetch assoc while循环工作,但是fetch列不工作。然后我使用SELECT COUNT(*),我的fetch列可以工作,但是fetch assoc不能。

那么有没有办法让这两种方法都能工作呢?因为我需要fetch列返回有多少行,作为一个整数值(1或0)来确定用户是否输入了登录信息。但是,我需要fetch column返回在我的数据库的表的username部分中输入的字符串值。这样我就可以使用这些信息来对照来自用户的输入进行检查,从而验证用户和密码。

谢谢,这是我的代码。如果你需要更清楚的解释,我可以试一试。

代码语言:javascript
复制
<?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循环正常工作。但是因为我不需要计数,所以我不能从数据库中检索我需要的信息。

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-06-02 18:17:54

像往常一样使用SELECT * FROM ...和PDO fetch assoc,并使用$result->rowCount();返回所有受影响的行,这与SELECT COUNT(*)等效

票数 4
EN

Stack Overflow用户

发布于 2013-06-02 17:34:27

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

代码语言:javascript
复制
$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;
}
票数 0
EN

Stack Overflow用户

发布于 2013-06-02 18:44:34

首先,您需要了解您正在使用的每个运算符的含义。

然后聪明地使用它,只在需要的时候使用,而不是仅仅因为你在某个地方看到过它们而添加任何运算符。

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

Transaction和try..catch也算数。

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

代码语言:javascript
复制
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
}

就这样

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16881472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档