Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/266.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQLi编写的语句,我不确定哪些变量需要占位符_Php_Mysql_Prepared Statement - Fatal编程技术网

Php MySQLi编写的语句,我不确定哪些变量需要占位符

Php MySQLi编写的语句,我不确定哪些变量需要占位符,php,mysql,prepared-statement,Php,Mysql,Prepared Statement,按照正确编码查询以处理准备好的语句的相同路线,我有以下查询: $sql = "SELECT * FROM photos WHERE g_id = ? LIMIT $curPage,".$totalPix; $result = $conn->query($sql) or die(mysqli_error()); $row = $result->fetch_assoc(); 这里的问题是,我是否应该为$curPage和$totalPix使

按照正确编码查询以处理准备好的语句的相同路线,我有以下查询:

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT $curPage,".$totalPix;
$result = $conn->query($sql) or die(mysqli_error());
$row = $result->fetch_assoc();
这里的问题是,我是否应该为$curPage和$totalPix使用准备好的语句占位符,如果是,我会这样做:

$sql = "SELECT *
        FROM photos
        WHERE g_id = ?
        LIMIT ?,".?;
$gid = $i; $lm = $v1; $mt = $v2 
$stmt = $conn->prepare($randPic);
$stmt->bind_param('iii', $gid, $lm, $mt);
$stmt->bind_result($p_fname);
$stmt->execute();
$stmt->store_result();
$stmt->fetch();

…或者变量$curPage和$totalpix是否没有让查询对SQL注入开放?非常感谢

您正在使用?在正确的位置,因为它只能用于变量绑定。但是,在查询中简单地放置$curPage或$totalPix是不安全的。我假设它们必须是整数,所以要保证安全并不难

使用intval$curPage和intval$TOTALLPIX确定它们是

但是,如果您想允许使用字符串,则要困难一些。不确定它是否是THE解决方案,但我打赌通过检查它是否是您为之设计的东西来“白名单”可能的选项

例如:从sometable中选择*,其中$somevar=?变量$somevar仍然可以是“1-”,它将返回所有行。但最有可能的意思是$somevar='id'或$somevar='email'。它可以很容易地被一些if语句检查,并且不会影响性能。可能需要一点打字,但如果你没有心情打字,我建议你使用一些框架来进行查询或某种形式的ORM


如果$somevar!='id“exit”找不到条目“;在函数或页面的开头,您可以在插入外部数据的任何位置使用占位符。但请注意,占位符不能用于表/字段名之类的内容,只能用于实际值。@Marc,非常感谢。我的整体结构正确吗?因此,即使使用硬编码变量,占位符仍然应该使用?好吧,您的第二个版本是一个语法错误。限度是无效的PHP,并在查询中留下一个悬空的逗号。@Marc,那么LIMIT?。?;那就对了,是吗?不是。这是语法错误。对于正确的PHP,它应该是LIMIT?,?;,但不能将占位符用于限制值。您必须使用常规PHP字符串操作将这些信息插入到查询中。哇,你们真的很酷,这些信息虽然有点让我费解,但非常有用。我向Jared提到了这一点:$curPage的值只是用于分页,从零开始,根据向后或向前分页而递增或递减,因此它始终是一个整数。至于$totalPix,这个数字是上一页的计数查询的结果,所以它总是一个整数。没有一个是用户输入的数据。我只是想避免SQL注入的危险。@wordman,在使用数据之前验证数据。就这么简单。一旦您学会了如何查看数据,您就会明白预测可访问数据的差异并不太困难。因此,如果提交了monkey butt,则不应使用它,但如果是20,则可以使用它,因为您希望提交的值与此类似。