使用PDO从MySQL数据库获取信息

时间:2015-05-29 00:01:19

标签: php mysql pdo

我正在尝试使用PHP(使用PDO)连接到MySQL数据库,但我不熟悉PHP,所以我有点卡住了。我正在尝试搜索我的一个数据库中所有出现的$ userid,然后将与它相关联的$ crn存储在一个数组中,但我真的不知道如何去做。这是我到目前为止所拥有的......

$sthandler = $conn->prepare('SELECT userid FROM users WHERE userid=' . $userid);
    $sthandler->execute(array('username'));

    if($sthandler->rowCount() > 0)
    {
        // User exists, get user's courses from database and returns array of CRNs
        for(int i = 0; i < rowCount; i++)
        {
            $sthandler = $conn->prepare('SELECT crn FROM usercourses WHERE userid=' . $userid);
            $sthandler->execute(array($USER => $crnArray));
        }            
    }

2 个答案:

答案 0 :(得分:2)

我建议您查看PDOPDOStatement上的文档以获取更多详细信息。

我猜你已经通过PDO连接到你的数据库了? (参见PDO :: __ construct())

使用准备好的查询,你最好“绑定”($ sthandler-&gt; bindParam())你的参数而不是连接它们,就像这样

$sthandler = $conn->prepare('SELECT userid FROM users WHERE userid= :user_id');
$sthandler->bindParam(':userid', $userid, PDO::PARAM_INT);

我不太了解你的其余代码。也许不完整。你在一些应该永远是唯一结果的东西上做一个循环(我希望你,“userid”是一个独特的主键)。

如果这个循环实际上没用,那么也许你应该考虑只使用一个查询来同时获得用户和课程,方法是使用表之间的连接:

SELECT u.userid, c.crn FROM users u INNER JOIN usercourses c ON u.userid = c.userid WHERE u.userid= :user_id

从这个结果中,得到你想要的任何东西。是的,你的结果中会有重复的数据(不同课程每一行的用户ID),但它仍然比做两个单独的查询更好。

考虑使用$sthandler->fetch()$sthandler->fetchAll()来获取每个结果,并将它们组织成一个数组,因为它适合您:

$rows = $sthandler->fetchAll(PDO::FETCH_ASSOC); // FETCH_ASSOC will return the results as array with columns' name as keys.
// Do your loop on the array $rows to process it

或者

while( $row = $sthandler->fetch(PDO::FETCH_ASSOC) ) {
     // do whatever you like with each row
}

同时请Darren建议用try/catch包装您的PDO查询以避免任何错误。

答案 1 :(得分:1)

PDO的目的是防止像你当前那样连接查询字符串。它应该被用来准备陈述。

$sthandler = $conn->prepare('SELECT userid FROM users WHERE userid= :user_id');
if($sthandler->execute(array(':user_id' => $user_id))) {
    if($sthandler->rowCount() > 0)
    {
        // User exists, get user's courses from database and returns array of CRNs
        for(int $i = 0; $i < rowCount; $i++)
        {
            $sthandler = $conn->prepare('SELECT crn FROM usercourses WHERE userid= :user_id';
            $sthandler->execute(array(':user_id' => $user_id));
        }            
    }
}

您尝试使用数组中的随机数据执行。

还有一件事,你应该将你的查询包装在try/catch语句中,以处理任何潜在的错误:

try {
    // run query and all
}
catch (PDOException $e){
    // echo out the error if there is one.
    echo $e->getMessage();
}

最后一个注意事项,而你还在做什么。在构造PDO对象时,您应该明确地打开错误!

$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false);