Php mysql查询限制使用属性:变量

Php mysql查询限制使用属性:变量,php,mysql,pdo,Php,Mysql,Pdo,当我在查询中使用以下格式时,我遇到语法错误或访问冲突 $limit = $request->getAttribute('limit'); $sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT :limit"; try{ $db = new db(); $db = $db->connect(); $stmt = $db->query($sql); $stmt-

当我在查询中使用以下格式时,我遇到语法错误或访问冲突

$limit = $request->getAttribute('limit');
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT :limit";

 try{
    $db = new db();
    $db = $db->connect();
    $stmt = $db->query($sql);
    $stmt->bindParam(":limit", $limit);

    $users = $stmt->fetchAll(PDO::FETCH_OBJ);

    $db = null;

    if(empty($users)) {
        $response->getBody()->write
        ('
        {
            "error":
            {
                "message":"Invalid Request"
            }
        }');
    } else {
        $response->getBody()->write(json_encode($users));
    }
} catch(PDOException $e) {}

如何在查询中调用limit属性?

最好使用prepare and execute语句,如:

$limit=10
$req=$db->prepare('SELECT * FROM users WHERE status = ? ORDER BY date DESC LIMIT ?');
$req->execute(array(1, $limit));

我从不使用bindParam语句。

最好使用prepare和execute语句,如:

$limit=10
$req=$db->prepare('SELECT * FROM users WHERE status = ? ORDER BY date DESC LIMIT ?');
$req->execute(array(1, $limit));

我从不使用bindParam语句。

您看到的语法错误是因为当您
bindParam()
时,PDO默认情况下会将您的参数作为字符串插入,因此DB引擎会看到类似
LIMIT“10”
的内容

因此,您有两种选择:您可以告诉PDO将值作为整数插入(请参见@Alive to Die answer),或者更简单地说,您可以将其转换为整数并将其正确地放入查询中。由于您是先进行强制转换,因此不存在SQL注入的风险:

$limit = (int) $request->getAttribute('limit');
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT $limit";

出现您看到的语法错误是因为当您
bindParam()
时,PDO默认情况下将您的参数作为字符串插入,因此DB引擎会看到类似
LIMIT“10”
的内容

因此,您有两种选择:您可以告诉PDO将值作为整数插入(请参见@Alive to Die answer),或者更简单地说,您可以将其转换为整数并将其正确地放入查询中。由于您是先进行强制转换,因此不存在SQL注入的风险:

$limit = (int) $request->getAttribute('limit');
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT $limit";
您需要按以下方式操作(更改已注释):-

$limit=$request->getAttribute('limit');
$sql=“从用户中选择*,其中状态=1订单日期描述限制:限制”;
试一试{
$db=新的db();
$db=$db->connect();
$stmt=$db->prepare($sql);//首先准备sql
$stmt->bindValue(':limit',(int)$limit,PDO::PARAM_int);//告诉您值是整数
$users=$stmt->fetchAll(PDO::FETCH_OBJ);
if(计数($users)==0){
$response->getBody()->write('{“error”:{“message”:“不再存在用户”}}');
}否则{
$response->getBody()->write(json_encode($users));
}
$db=null;
}捕获(PDO$e){
打印“错误!:”$e->getMessage()。“
”; 模具(); }
您需要按照以下方式进行操作(更改已注释):-

$limit=$request->getAttribute('limit');
$sql=“从用户中选择*,其中状态=1订单日期描述限制:限制”;
试一试{
$db=新的db();
$db=$db->connect();
$stmt=$db->prepare($sql);//首先准备sql
$stmt->bindValue(':limit',(int)$limit,PDO::PARAM_int);//告诉您值是整数
$users=$stmt->fetchAll(PDO::FETCH_OBJ);
if(计数($users)==0){
$response->getBody()->write('{“error”:{“message”:“不再存在用户”}}');
}否则{
$response->getBody()->write(json_encode($users));
}
$db=null;
}捕获(PDO$e){
打印“错误!:”$e->getMessage()。“
”; 模具(); }
在查询中同时输入
$limit
变量

$limit = $request->getAttribute('limit');
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT $limit";

请在查询中输入
$limit
变量

$limit = $request->getAttribute('limit');
$sql = "SELECT * FROM users WHERE status = 1 ORDER BY date DESC LIMIT $limit";

在PDO中,将其定义为INT

$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);

在PDO中,将其定义为INT

$stmt->bindParam(':limit', $limit, PDO::PARAM_INT);

检查这一条:那么您遇到了什么问题?“语法错误或访问冲突”-是哪一个?您还应该查看如何使用准备好的语句。您当前没有准备该参数,并且在对数据库进行查询后尝试绑定该参数。请检查此项:您遇到了什么问题?“语法错误或访问冲突”-是哪一个?您还应该查看如何使用准备好的语句。您当前没有准备它,并且在查询到数据库后尝试绑定参数。
$db->('SELECT…
?我想您错过了
prepare()
。另外,我不认为
状态
限制
相同。OP的值为
状态
硬编码,因此保持硬编码。是的,更正。
$db->('SELECT…
?我想你错过了
准备()
。另外,我不认为
状态
限制
是一样的。OP的值为
状态
硬编码,因此保持硬编码。是的,更正了。它是这样工作的,但我不断收到无效请求,就好像响应$users为空一样。它是这样工作的,但我不断收到无效请求,就好像响应$users为空一样emptystill no result i get no no no no no no no no no no no no no no no no no no no result i get no no no no no no no no no no no no no no no no no no no no no no no no no result i get no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no no我的问题,并修复了我得到的语法错误,这是查询中的一个问题,因为即使我将
:limit
替换为
limit=2
,我仍然没有得到任何数据,我会解决的,谢谢你的帮助,伙计