0

我在使用 PDO 时遇到了一些问题。第一个问题是在我的连接字符串中,我不能使用在另一个文件中定义的变量(尝试包含和要求)。它给了我一个错误,并显示了具有变量名称而不是值的连接字符串(是的,尝试了单引号和双引号)。

第二个问题,更紧迫的是,我在尝试验证登录时遇到错误。我让它与旧的 mysqli 一起工作,所以我知道 html 是有效的,只是不是新的逻辑。附件是我正在使用的功能:

function validateuser($un, $em)
{
    try
    {
        $db = new PDO("mysql:host=localhost;dbname=XX", 'aa', 'bb', array(
            PDO::ATTR_EMULATE_PREPARES => false,
            PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
        ));
        $stmt = $db->query("SELECT AcctType FROM usr WHERE LOGIN_ID=? or CONTACT_EMAIL=?;");
        $stmt->execute(array(
            $un,
            $em
        ));
        return $stmt->fetchAll(PDO::FETCH_ASSOC);
    }

    catch(exception $e)
    {
        echo $e;
    }
}

我得到的确切错误是:

Exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2031 ' in db_backend.php:110 Stack trace: #0 db_backend.php(110): PDO->query('SELECT AcctType...') #1 newuser.php(42): validateuser('Nefer', 'neferitous@blah...') #2 {main}



提前致谢!!

4

3 回答 3

3

In order to bind parameters, you need to use a prepared statement and not a query.

Try the following:

$stmt = $db->prepare("SELECT AcctType FROM usr WHERE LOGIN_ID=? or CONTACT_EMAIL=?;");
$stmt->execute(array(
    $un,
    $em
));
于 2013-06-14T19:53:59.213 回答
0

对于您的第一个问题,我很确定您可以断开字符串并将变量连接到:

PDO("mysql:host=".$host.";dbname=".$dbname, $user, $pass,
于 2013-06-14T22:21:24.810 回答
-4

这是使 PDO 语句的这一部分工作的最终代码:

function validateuser($un, $em) {
    try {
        $db = new PDO(
            "mysql:host=localhost;dbname=db",
            'id',
            'pass',
            array(PDO::ATTR_EMULATE_PREPARES => false, PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
        );
        $stmt = $db->prepare("SELECT ACCTTYPE FROM users WHERE LOGIN_ID=? or CONTACT_EMAIL=?;");
        $stmt->bindParam(1, $un, PDO::PARAM_STR, 15);
        $stmt->bindParam(2, $em, PDO::PARAM_STR, 150);
        $stmt->execute();
        $result = $stmt->fetch();
        return $result["ACCTTYPE"];
    } catch (exception $e) {
        echo $e;
    }
}
于 2013-06-17T20:09:30.223 回答