我正在尝试使用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));
}
}
答案 0 :(得分:2)
我建议您查看PDO和PDOStatement上的文档以获取更多详细信息。
我猜你已经通过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);