小改动打破了mysql查询

时间:2012-10-29 18:01:18

标签: php mysql

  

可能重复:
  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();

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

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

2 个答案:

答案 0 :(得分:0)

与推荐的example on how to apply values to LIMIT conditions

一样
$stmt -> execute(array(
  'cat' => $category,
  'page' => (int) $page
));

答案 1 :(得分:-2)

Ray已经给出了答案:将用户提交的页面变量强制转换为整数(确保这样做或者您将容易受到SQL注入攻击)并直接将其插入查询字符串而不使用占位符。< / p>