Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/243.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 在带有占位符的查询中区分用户数据和参数名称_Php_Mysql_Sql Injection - Fatal编程技术网

Php 在带有占位符的查询中区分用户数据和参数名称

Php 在带有占位符的查询中区分用户数据和参数名称,php,mysql,sql-injection,Php,Mysql,Sql Injection,我使用一个类来构建一个带有命名参数的MySQL查询,以将数据绑定到它。一个示例查询可能是 INSERT INTO table (title, text) VALUES (?title, ?text) 现在,您可以通过提供参数名称和值来指定用于这些占位符(?title,?text)的值。在这个过程中,值将被转义(基本上是mysql\u real\u escape\u string,并对布尔值、数组等进行特殊处理) 问题是一个值本身包含占位符,因为我按顺序替换它们。要完成上述示例,替换可以如下所示

我使用一个类来构建一个带有命名参数的MySQL查询,以将数据绑定到它。一个示例查询可能是

INSERT INTO table (title, text) VALUES (?title, ?text)
现在,您可以通过提供参数名称和值来指定用于这些占位符(
?title
?text
)的值。在这个过程中,值将被转义(基本上是
mysql\u real\u escape\u string
,并对布尔值、数组等进行特殊处理)

问题是一个值本身包含占位符,因为我按顺序替换它们。要完成上述示例,替换可以如下所示

title -> "hey ?text"
text -> "lorem ipsum ..."
我的第一个想法是首先用唯一值替换占位符。这些必须是转义字符串中不能出现的字符串

这是一种好方法吗?有哪些字符序列用于此目的?

请看一下使用with

您需要做的是获取现有的命名参数,并用问号替换它们。当您依次从查询字符串中提取命名参数时,您将构建一个有序数组,用于
mysqli\u stmt\u bind\u param()
函数,并从值数组中放置适当的值。构建有序数组后,需要对其进行迭代并进行类型检查,以便将
$types
值传递到
mysqli\u stmt\u bind\u param()


我强烈建议您考虑使用类似的库来代替自己的库。我认为您的整个概念是错误的。
你在混淆视听

占位符只能用于向查询添加值。不是为了创造花哨的语法

没有什么能阻止你做这样的事情

$text=“lorem ipsum…”; $title=“嘿$text”

所以用这种方法准备好变量。 然后才将它们放入查询中

然而,我可能忽略了一些明智的问题。如果你有一些理由充分的反对意见,我会尽力为你找到解决办法


至于你标题中的问题,我只是在逃避?和另一个??在我的占位符解析器中

您是如何进行字符串替换的?为什么不使用PDO进行替换?@hafichuk现在它们是foreach循环中的简单
str_ireplace
调用。参数保存在关联数组中,直到请求最终查询为止。@Paul我使用自己的类进行MySQL连接和查询已有一段时间了,只需要这个小功能。所以我不想把一切都重写成PDO。基本概念是几行代码。事实上,我没想到要为MySQL查询找到一个保存序列会那么困难。我正在使用命名参数按我需要的任何顺序添加它们。而且,当一个函数调用中有10个参数时,它看起来非常糟糕。是的,有使用数组的解决方案,但我现在决定使用这些命名参数。此外,还可以多次使用它们。我理解使用命名参数的目的。如果我的答案不清楚,我建议您可以将现有的PHP函数(mysqli_prepare和mysqli_stmt_bind_params)与您可以遵循的逻辑一起用于mysql类的内部。仅供参考,PDO库提供了源代码。你的最后一句话告诉我你不理解这个问题。现在是什么阻止用户在查询中输入“?”和占位符名称?虽然你可以想象任何不太可能被用户意外发现的新奇替代品,但我正在寻找一个使之不可能的值。这更像是一个理论问题。后来我发现了一个高度依赖于所使用的转义函数的解决方案,但我对此不太满意,这就是为什么我没有发布它的原因。