0

只是为了让你们都知道,我开始学习 PDO 所以不要生我的气:)

当我使用 mysqli 时,我会这样做从查询中获取结果并回显一些内容:

$query2= "SELECT acess FROM statistic WHERE id_page IN(SELECT id FROM page WHERE title='".$registos1['title']."')";
        $result2 = mysqli_query($ligaBD,$query2);
        $registos2 = mysqli_fetch_array($result2);

        if($registos2['acess']==0){
            echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>...</title></head><body>This page is private.</body></html>';exit;

现在我试图在 PDO 上做到这一点,但如果它是这样的,我不舒尔:

$sql = "SELECT acess FROM statistic WHERE id_page IN(SELECT id FROM page WHERE title=?)";
        $stm = $ligaBD->prepare($sql);
        $stm->execute(array($acess));
        $stm->fetchColumn();

        if(($row = $stm->fetch(PDO::FETCH_ASSOC))){
            echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Easy Page Builder</title></head><body>This page is private.</body></html>';exit;
        }

if($registos2['acess']==0){和这个一样if(($row = $stm->fetch(PDO::FETCH_ASSOC))){吗?

fetch(PDO::FETCH_ASSOC) 返回的值是多少?我已经读过它是布尔值,但如果这甚至是用于从查询中获取结果的正确代码,我不知道,就像我过去在使用 mysqli 时所做的那样。

谢谢。

4

2 回答 2

1

不,它没有。您错过了 PDO 代码中的一步。您获取一行,但不要查看您获取的内容。它应该更像:

    $stm->execute(array($acess));
    $row = $stm->fetch(PDO::FETCH_ASSOC);
    if ($row['access'] == 0) {
       ...
    }

在编写代码时,您获取行结果,但在基本 if() 中使用该行结果。如果检索到数据,$row 将是一些非空数据,PHP 将其转换为布尔值 TRUE,这意味着您会收到“拒绝访问”消息。即使查询的实际结果显示“授予访问权限”,也会发生这种情况,因为您没有查看查询的结果数据,您只是在测试是否返回了任何数据。

于 2013-04-17T16:35:49.507 回答
0

如果您只需要访问列中的数据,fetchColumn()就足够了。

/* The $columnIndex is the zero-based index of the `access` column */

$sql = "SELECT acess FROM statistic WHERE id_page IN(SELECT id FROM page WHERE title=?)";
$stm = $ligaBD->prepare($sql);
$stm->execute(array($acess));
$result = $stm->fetchColumn($columnIndex);

if($resut === 0){
        echo '<head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>Easy Page Builder</title></head><body>This page is private.</body></html>';exit;
}

如果没有返回行或列$result具有此值,请记住。因此,您必须与运营商进行比较。FALSE0access===

于 2013-04-17T16:39:33.270 回答