我承认php对我来说是一门新语言
现在我可以让它们单独工作了。在我的准备查询SELECT * FROM…将允许我的PDO取回关联while循环工作,但然后取回列不工作。然后我使用SELECT COUNT(*)我的取回列工作但取回关联不能。
所以是否有这样的距离,所以两者都将工作?因为我需要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循环工作。而while循环通常工作,如果我有SELECT *。但因为我不需要因为我需要计数它不需要。所以我不能从数据库中检索我需要的信息
使用SELECT * FROM ...
和PDO正常获取关联,使用$result->rowCount();
返回所有受影响的行,这相当于SELECT COUNT(*)
如果您使用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;
}
首先你需要理解每个操作符的含义。
然后聪明地使用它,只在需要的时候,而不是添加任何操作符,因为你看到它们在某处被使用。
事实上,您既不需要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
}
的
这个登录的例子有一个很大的缺陷,它从$_POST中选择密码并直接查询到mysql。
表示密码在数据库中是清晰的
要应用最佳实践,您应该散列+盐密码和加密所有个人数据。
关于如何做的一个很好的概述:
http://www.sitepoint.com/hashing-passwords-php-5-5-password-hashing-api/