php - 尝试将 mysql select 语句转换为 PDO

标签 php mysql sql pdo

我正在尝试将旧的 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/

相关文章:

php - 如何覆盖核心 Woocommerce 插件功能?

mysql order by 来自不同的表打破了排名

mysql - 如何: Insert into column where the value is on another table

MySQL - JOIN 条件和性能问题

php - 如何限制wordpress媒体上传中不需要的图像存储

php - 将 JSON 字符串作为 HTTP 查询参数发送?

Mysql - 跨表排除有效..几乎

php - 在 MAMP 中导入数据库时​​出错

mysql - 在插入时创建 MySQL 触发器

php - "Cannot pass parameter 2 by reference"PHP错误