4

可能重复:
PHP PDO bindValue in LIMIT

我有这段代码很好用。

if (array_key_exists('cat', $_GET) === TRUE) {
    $category = $_GET['cat'];
} else {
    $category = '.*';
}


$conn = new PDO('mysql:host=localhost;dbname=news', 'root', '');
$stmt = $conn->prepare('SELECT * FROM stories 
                        WHERE category RLIKE :cat
                        ORDER BY score DESC LIMIT 0, 25');
$stmt -> execute(array(
    'cat' => $category,
    ));

$result = $stmt->fetchAll();

如您所见,它从 get 请求中获取一个类别,并在数据库中搜索该类别中的所有内容。

我还尝试添加一点,以便可以在 get 请求中定义一个页面,并且查询将在 25 行之后开始,每增加一个页面。

这是我写的:

if (array_key_exists('cat', $_GET) === TRUE) {
    $category = $_GET['cat'];
} else {
    $category = '.*';
}

if (array_key_exists('page', $_GET) === TRUE) {
    $page = intval($_GET['page'])*25;
} else {
    $page = 0;
}


$conn = new PDO('mysql:host=localhost;dbname=news', 'root', '');
$stmt = $conn->prepare('SELECT * FROM stories 
                        WHERE category RLIKE :cat
                        ORDER BY score DESC LIMIT :page, 25');
$stmt -> execute(array(
    'cat' => $category,
    'page' => $page
    ));

$result = $stmt->fetchAll();

但是现在,无论是什么页面,或者是否有类别,查询都没有返回任何内容。

也许我没有正确处理整数。知道为什么我会得到这个结果吗?

4

2 回答 2

0

正如所提到的关于如何将值应用于 LIMIT 条件的示例

$stmt -> execute(array(
  'cat' => $category,
  'page' => (int) $page
));
于 2012-10-29T18:32:48.810 回答
-2

Ray 已经给了你答案:将用户提交的页面变量转换为一个整数(一定要这样做,否则你将容易受到 SQL 注入的攻击)并将其直接插入到查询字符串中,而不使用占位符。

于 2012-10-29T18:14:50.347 回答