PDO SELECT语句麻烦

时间:2014-08-06 04:55:20

标签: php mysql pdo

我正在尝试将我的代码从基本的mysql / php切换到PDO,我可以为插入操作,但到目前为止我遇到了一些问题。下面的代码应该在类别中显示用户帖子的类别,但是我没有得到任何结果,当我做var_dump()时,我在底部得到了结果。

$user_ID = get_current_user_id();
$the_SID = ( isset( $_GET['writing'] ) ) ? $_GET['writing'] : false;

$results = $dbh->prepare("select 
wp_users.ID,
wp_users.display_name,
stories.ID,
stories.SID,
stories.name,
stories.category,
writing.ID,
writing.text   
FROM writing
LEFT JOIN stories on writing.SID = stories.SID
LEFT JOIN wp_users ON writing.ID = wp_users.ID
WHERE (stories.SID = $the_SID) AND (writing.approved = 'Y')
order by position desc limit 1");

$results->bindParam(':wp_users.ID', $user_ID, PDO::PARAM_INT); 
$results->bindParam(':display_name', $display_name, PDO::PARAM_STR); 
$results->bindParam(':stories.ID', $ID, PDO::PARAM_INT); 
$results->bindParam(':name', $story_name, PDO::PARAM_STR); 
$results->bindParam(':category', $category, PDO::PARAM_STR); 
$results->bindParam(':writing.ID', $ID, PDO::PARAM_STR); 
$results->bindParam(':text', $text, PDO::PARAM_STR); 

$results->execute();


Category: <?php echo $results[0]->category ?><br />
//also tried without [0] but neither works:
Category: <?php echo $results->category ?><br />

echo var_dump($results);

当我加载页面时,我没有显示类别的结果,var_dump只显示这个,这基本上只是打印sql命令的前半部分,好像我没有用引号或其他东西:< / p>

//结果返回并在WEBPAGE上打印

Category: 

object(PDOStatement)#77 (1) {
["queryString"]=>
string(457) “select
wp_users.ID,
wp_users.display_name,
stories.ID,
stories.SID,
stories.name,
stories.category,
writing.ID,
writing.text
FROM writing
LEFT JOIN stories on writing.SID = stories.SID
LEFT JOIN wp_users ON writing.ID = wp_users.ID
WHERE (stories.SID = 18)
order by position desc limit 1″
}

2 个答案:

答案 0 :(得分:3)

我只是把它扔给你答案。

您遇到的问题是您没有获取结果。这可以通过以下方式解决( 正如您在评论中所说的那样: - )

$row = $results->fetchAll(PDO::FETCH_ASSOC);

这将返回从您的查询中提取的所有行的 array

你可以得到这样的元素:

echo $row[0]['category'];

但正如您在评论中所要求的那样,更简单的方法是使用循环。 如果您要打印所有数据:)

foreach($row as $item) {
    echo "Category: {$item['category']} <br />";
    //.....etc for the rest of the items in the array
}

或者,您可以像许多其他脚本一样使用while循环来执行此操作:

while($row = $results->fetch()) {
    echo "Category: {$item['category']} <br />";
    //.....etc for the rest of the items in the array
}

答案 1 :(得分:1)

您没有构建有效的“预备”查询。你有这个,

$results->bindParam(':wp_users.ID', $user_ID, PDO::PARAM_INT); 
$results->bindParam(':display_name', $display_name, PDO::PARAM_STR); 
$results->bindParam(':stories.ID', $ID, PDO::PARAM_INT); 
$results->bindParam(':name', $story_name, PDO::PARAM_STR); 
$results->bindParam(':category', $category, PDO::PARAM_STR); 
$results->bindParam(':writing.ID', $ID, PDO::PARAM_STR); 
$results->bindParam(':text', $text, PDO::PARAM_STR); 

但在查询中定义了 none 这些参数。您所做的只是直接将“story id”值替换为查询,这首先打破了使用准备好的查询的整个目的。

这是prepare()语句的样子:

$results = $dbh->prepare("select 
wp_users.ID,
wp_users.display_name,
stories.ID,
stories.SID,
stories.name,
stories.category,
writing.ID,
writing.text   
FROM writing
LEFT JOIN stories on writing.SID = stories.SID
LEFT JOIN wp_users ON writing.ID = wp_users.ID
WHERE (stories.SID = :sid) AND (writing.approved = 'Y')
order by position desc limit 1");

你只需要一个bind_param()

$results->bindParam(':sid', $ID, PDO::PARAM_INT);