2011-11-06 72 views
0

我正在使用一个类来构建一个具有命名参数的MySQL查询以将数据绑定到它。示例查询可能是。现在使用占位符区分用户数据和查询中的参数名称

INSERT INTO table (title, text) VALUES (?title, ?text) 

你可以指定值通过给参数名称和值使用这些占位符(?title?text)。在这个过程中,这个值将会被转义(基本上mysql_real_escape_string带有布尔值,数组等的特殊处理)。

问题是一个包含占位符本身的值,因为我依次替换它们。为了完成上面的例子,替换可以如下。

title -> "hey ?text" 
text -> "lorem ipsum ..." 

我的第一个想法是首先用唯一值替换占位符。这些必须是不能出现在转义字符串中的字符串。

这是一个好方法,以及为此目的存在哪些字符序列?

+0

你是如何做字符串替换? – hafichuk

+0

为什么你不使用PDO? – Paul

+0

@hafichuk现在他们在foreach循环中调用简单的'str_ireplace'调用。参数保存在关联数组中,直到请求最终查询。 – Frank

回答

0

看看使用mysqli_prepare()mysqli_stmt_bind_param()

你需要做的是拿你现有的命名参数,并用只有问号代替它们。当你顺序地从查询字符串中提取命名参数时,你将会构建一个有序数组,你将在你的函数中使用这个数组,并从你的数组中放置合适的值。一旦构建了有序数组,您需要遍历它并进行类型检查,以便您可以将$types值传递到mysqli_stmt_bind_param()

我强烈建议你看看使用像PDO这样的库来代替自己。

+0

我使用命名参数以我需要的任何顺序添加它们。当一个函数调用中有10个参数时,它看起来非常讨厌。是的,有阵列的解决方案,但我现在决定这些命名参数。另外可以多次使用它们。 – Frank

+0

我了解使用命名参数的目的。如果我的回答不明确,我建议您可以使用现有的PHP函数(mysqli_prepare和mysqli_stmt_bind_params)来查看mysql类的内部以及您可以遵循的逻辑。 – hafichuk

+0

仅供参考,源代码可用于PDO库。它可能会给你一些关于如何实现这种事情的想法。 – hafichuk

0

我相信你的整个概念是错误的。
您正在混合的事项。

占位符应仅用于向查询添加值。不要创建花哨的语法。

没有阻止你做一些像

$文字= “Lorem存有......”; $ title =“hey $ text”;

所以让你的变量准备好这种方式。 然后才把它们放入查询中。

但是,我可能会忽略一些明智的问题。如果您有一些理由充分的反对意见 - 我会尽力为您找到解决方案

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

+0

你最后一句话告诉我你没有理解这个问题。现在阻止你的用户进入“??”后跟您的查询中使用的占位符名称?虽然你可以想象任何奇特的替代品不可能被用户偶然发现,但我正在寻找一种使它不可能的价值。这更多的是理论上的东西。后来我发现了一个高度依赖于使用的转义函数的解决方案,但我对此并不满意,这就是为什么我没有发布它。 – Frank

相关问题