我正在尝试将旧的 MySQL 库转换为 PDO。
为了使用我使用的旧 MySQL 代码读取数据:
$assoc = mysql_fetch_assoc($exeqr);
对于 PDO,我正在尝试使用 foreach
来实现这一点,就像我在使用 PDO 的代码中所做的那样,但它不起作用......
你能看出这里有什么问题吗??
我使用 MySQL 的旧颂:
<?php
if(isset($_POST['sendLogin']))
{
$f['email'] = mysql_real_escape_string($_POST['email']);
$f['pass'] = mysql_real_escape_string($_POST['password']);
if(!$f['email'] || !valMail($f['email']))
{
echo 'Email empty or invalid';
}
else if(strlen($f['pass']) <8 || strlen($f['pass'])>12)
{
echo 'pass must have between 8 and 12 chars!';
}
else
{
$autEmail = $f['email'];
$autpass = $f['pass'];
$query = "SELECT * FROM users where email= '$autEmail'";
$exeqr = mysql_query($query) or die(mysql_error());
$assoc = mysql_fetch_assoc($exeqr);
if(mysql_num_rows($exeqr) == 1 )
{
if($autEmail == $assoc['email'] && $autpass == $assoc['pass'])
{
$_SESSION['assoc'] = $assoc;
header('Location:'.$_SERVER['PHP_SELF']);
}
else
{
echo ' wrong password';
}
}
else
{
echo 'email does no exist';
}
}
}
我尝试使用 PDO 转换的新代码:
<?php
if(isset($_POST['sendLogin']))
{
$f['email'] = mysql_real_escape_string($_POST['email']);
$f['pass'] = mysql_real_escape_string($_POST['password']);
if(!$f['email'] || !valMail($f['email']))
{
echo 'Email empty or invalid';
}
else if(strlen($f['pass']) <8 || strlen($f['pass'])>12)
{
echo 'pass must have between 8 and 12 chars!';
}
else
{
$autEmail = $f['email'];
$autpass = $f['pass'];
$searchEmail = $pdo->prepare("SELECT * FROM users where email=:email");
$searchEmail->bindValue(":email,$autEmail");
$searchEmail->execute;
$num_rows = $searchEmail->fetchColumn();
$result = $searchEmail->fetch(PDO::FETCH_OBJ);
if($num_rows == 1)
{
if($autEmail == $result['email'] && $autpass == $result['pass'])
{
$_SESSION['result'] = $result;
header('Location:'.$_SERVER['PHP_SELF']);
}
else
{
echo ' wrong password';
}
}
else
{
echo 'email does no exist';
}
}
}
最佳答案
Warning: PDOStatement::bindValue() expects at least 2 parameters, 1 given in $searchEmail->bindValue(":email,$autEmail");
您需要移动您的 "
,目前它包括变量和参数名称,导致您没有传递变量以绑定(bind)到所述参数(这就是您收到错误的原因告诉你你没有传递足够的参数)。
$searchEmail = $pdo->prepare("SELECT * FROM users where email = :email");
$searchEmail->bindValue(":email", $autEmail);
Notice: Undefined property: PDOStatement::$execute in $searchEmail->execute;
您忘记了 execute()
中的 ()
括号,因此 PHP 正在寻找名为 execute
的 PDO 类的属性而不是函数调用。
$searchEmail->execute();
(感谢 Prix)
Edit
您现在的问题是如何替换它:
$assoc = mysql_fetch_assoc($exeqr);
... 具有等效的 PDO。 In the manual, there is an example :
$assoc = $searchEmail->fetchAll(PDO::FETCH_COLUMN|PDO::FETCH_GROUP);
注意 fetchAll()
用于获取多个结果。如果您只期望一个结果(您可能是这样,但您没有限制查询,因此返回多个结果是可行的),您应该只使用 fetch()
:
$assoc = $searchEmail->fetch(PDO::FETCH_ASSOC);
关于php - 尝试将 mysql select 语句转换为 PDO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22702249/