为什么我的PHP PDO在不使用页面限制时选择进入?在select中也有问题

时间:2017-07-06 16:49:34

标签: php pdo

为什么hello不显示在屏幕上,为什么while循环没有执行? 另外我有一个问题,因为数组$ zipcodeA [$ x]可能包含随机邮政编码,如90564 80564 70564 88464 98754,但数据库tman可能包含信息,如90564 90564 90564 80564 70564 70564 88464 98754.如何选择浏览数组$ zipcodeA [$ x]中的所有邮政编码,而不是仅仅提取每个邮政编码之一的信息?数据库包含随机邮政编码,许多邮政编码可以重复,数组只有许多不同的邮政编码,没有重复邮件

for($x = 0; $x <= $v; $x++) 
{
$stmt = $conn->prepare("SELECT * FROM tman WHERE approve = 'Y' AND zip = :zipp ORDER BY id desc limit :limit");
$stmt->bindParam(":zipp", $zipcodeA[$x], PDO::PARAM_INT); 
$stmt->bindValue(':limit', (int) $limit, PDO::PARAM_INT); 
echo '<br>zipcode: ' . $zipcodeA[$x] . '<br>';
$stmt->execute();   
    while($row = $stmt->fetch(PDO::FETCH_ASSOC))
    {
      $id2 = $row['id'];
      $name = $row['name'];
      echo 'hello';

    } 
}

3 个答案:

答案 0 :(得分:1)

尝试这样做:

$limit = ($pageno - 1) * $rows_per_page . ',' . $rows_per_page; 
for($x = 0; $x <= $v; $x++) {
    $stmt = $conn->prepare("SELECT * FROM tman WHERE approve = 'Y' AND zip = :zipp ORDER BY id desc LIMIT " . $limit);
    $stmt->bindParam(":zipp", $zipcodeA[$x], PDO::PARAM_INT); 
    echo '<br>zipcode: ' . $zipcodeA[$x] . '<br>';
    $stmt->execute();   
    $result = $stmt->fetch(PDO::FETCH_ASSOC);
    if (!empty($result)) {
        $id2 = $result['id'];
        $name = $result['name'];
        echo 'hello';
    }
}

答案 1 :(得分:1)

您应该使用PHP变量替换limit参数:

$stmt = $conn->prepare("SELECT * FROM tman
    WHERE approve='Y' AND zip=:zipp
    ORDER BY id DESC LIMIT $limiter");

根据PHP PDO::prepare手册有关准备好的陈述:

  

使用这些参数绑定 任何用户输入 ,不要包含   用户直接在查询中输入。

由于准备语句允许您过滤用户输入,因此不允许这些参数替换应由开发人员设置的查询的任何其他部分。例如,允许参数替换表名将提供对攻击者的访问权,以便在用户有权访问的任何内容上使用用户的权限。同样,在您的情况下,LIMIT是通过MySQL提供的查询优化。利用此功能可以关闭存在大量数据集的系统。

此外,您应该使用Try/Catch statement包装PDO查询,以防止其他人在抛出PDO异常时看到它们。

//Load your IP here
$dev_ip = 'your.ip.address.here';
//Filter the user's IP
$user_ip = filter_input(INPUT_SERVER,'REMOTE_ADDR', FILTER_VALIDATE_IP);
//Set your limiting variable
$limiter = ($pageno-1)*$rows_per_page.','.$rows_per_page; 
for($x = 0; $x <= $v; $x++) {
    try {
    $stmt = $conn->prepare("SELECT * FROM tman WHERE approve='Y' AND zip=:zipp ORDER BY id desc LIMIT $limiter");
    $stmt->bindParam(":zipp", $zipcodeA[$x], PDO::PARAM_INT); 
    if(array_key_exists($x, $zipcodeA)&&!empty($zipcodeA[$x])){
        echo '<br>zipcode: ' . $zipcodeA[$x] . '<br>';
        $stmt->execute();   
        $result = $stmt->fetch(PDO::FETCH_ASSOC);
        if (array_key_exists('id', $result)&&!empty($result['id'])) {
            $id2 = $result['id'];
        } else {
            if($user_ip==$dev_ip){
             echo 'No ID';
            }
        }
        if (array_key_exists('name', $result)&&!empty($result['name'])) {
            $name = $result['name'];
        } else {
            if($user_ip==$dev_ip){
             echo 'No Name';
            }
        }
    }

    } catch(PDOException $ex) {
        echo "An Error occured!"; //user friendly message
        if($user_ip==$dev_ip){
         echo $ex->getMessage();
        }
    }
}

答案 2 :(得分:0)

不要将循环条件建立在 fetch()的结果上。获得结果并单独评估。

来自docs:“此函数的成功返回值取决于获取类型。” IE对于布尔评估来说,这不是一件好事。 如果失败,它将返回false但是当它成功时它可能会以意想不到的方式运行。

更好 - 使用 fetchAll() 并循环生成结果数组。

最后 - 使用 print_r()检查结果集。确保你有东西要循环。