2012-10-29 36 views
4

可能重复:
PHP PDO bindValue in LIMIT小的变化打破了MySQL查询

我有这样的代码,工作得很好。

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请求中定义一个页面,并且查询将在稍后的页面中每增加一个,开始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(); 

但现在,该查询返回什么,不管什么页面,或者还有一类。

也许我没有处理整数正确。任何想法,为什么我得到这个结果?

+0

你能值传递给PDO一样,如果它不是一个字符串? (没有与PDO经验) –

+0

也许不是。我也没有经验。我希望有一些方法可以将int放入查询中。 – user1624005

+0

也http://stackoverflow.com/questions/5508993/pdo-limit-and-offset和其他人。询问前请尝试使用右上角的搜索功能。 – kapa

回答

-2

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

+0

如示例中所示,使用占位符时,PDO将正确清理所有用户输入。这里的问题是参数是一个字符串并且正确地转义了,但是'LIMIT'子句不能和字符串参数一起使用,所以需要强制转换。 – tadman