2

私はphpが私にとって新しい言語であることを認めます。

これで、これらのそれぞれを個別に機能させることができます。私の準備クエリ SELECT * FROM... では、PDO fetch assoc while ループは機能しますが、列のフェッチは機能しません。次に、SELECT COUNT(*) を使用すると、フェッチ列は機能しますが、フェッチ アソシエーションは機能しません。

それで、この周りに離れているので、両方が機能しますか?ユーザーがログイン情報を入力したかどうかを判断するために、整数値 (1 または 0) として存在する行数を返すには、fetch 列が必要です。しかし、データベースのテーブルのユーザー名セクションに入力された文字列値を返すために、そこに列をフェッチする必要があります。この情報を使用して、ユーザーからの入力と照合してユーザーとパスワードを検証できるようにします。

ありがとう、これが私のコードです。もっと明確に説明する必要がある場合は、試してみます。

<?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 ループは正常に機能します。しかし、カウントが必要なので、そうしないので、そうではありません。そのため、データベースから必要な情報を取得できません。

4

4 に答える 4

4

SELECT * FROM ...通常どおり PDO fetch assoc を使用し$result->rowCount();、影響を受けるすべての行を返すために使用します。SELECT COUNT(*)

于 2013-06-02T10:17:53.517 に答える
0

ログインの例には大きな欠陥が 1 つあります。$_POST からパスワードを取得し、それを mysql に直接クエリします。

これは、パスワードがデータベースで明確であることを意味します。

ベスト プラクティスを適用するには、パスワードをハッシュ + ソルトし、すべての個人データを暗号化する必要があります。

それを行う方法の良い概要:

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

于 2014-07-17T07:29:51.317 に答える
0

データベースに指定されたユーザー名を持つユーザーがいるかどうかを確認するためだけにクエリを実行するcount(*)場合、それは必要ありません。代わりに最初の行をフェッチすることもできます。それが空の場合、ユーザーは存在しません。それ以外の場合は、少なくとも 1 人存在します。したがって、あなたは暗黙のうちにあなたの情報を持っています。

$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;
}
于 2013-06-02T09:34:26.947 に答える