准备好的声明的内部结构是什么样的?

时间:2013-11-17 19:01:55

标签: mysql sql ruby sqlite dbi

以下是bind_params似乎准备 sql语句的方法:

stmt = db.prepare( "select * from table where a=? and b=?" )
stmt.bind_params( 15, "hello" )

所以实际上在stmt中,我们需要有map / array或者最终会映射参数并创建正确的stmt的东西。在内部执行此操作的最佳方式是什么?加上字符串我需要额外的预防措施 - 上面的内容必须像“select * from table a a = 15 and b = \”hello \“”。

我查看了SQLite3和OCI,他们似乎将这些传递给内部C代码。

1 个答案:

答案 0 :(得分:3)

  

我正在尝试在客户端准备查询并将其发送到服务器

如果你想要做的事情听起来就像你想做的那样......不要试图这样做。

这不是准备好的陈述(或者至少不是它应该是什么)。

您的客户端代码不应尝试将值插入查询字符串,以生成“已完成”查询以发送到服务器以供执行。这是灾难的一种方法,更不用说虚假的安全感了。

预备语句将带有?占位符的语句按原样发送到服务器,其中服务器“准备”执行语句...然后客户端将参数发送到服务器(“绑定”参数)执行。这样做,服务器永远不会混淆“哪个部分是SQL”和“哪个部分是数据”,这使得无法进行sql注入,并且无需转义和清理数据。

  

mysql_stmt_bind_param()用于绑定传递给mysql_stmt_prepare()的SQL语句中参数标记的输入数据。它使用MYSQL_BIND结构来提供数据。 bind是MYSQL_BIND结构数组的地址。客户端库期望数组包含查询中存在的每个?参数标记的一个元素。

     

- http://dev.mysql.com/doc/refman/5.6/en/mysql-stmt-bind-param.html

如果您没有直接与C-API通信,那么您应该调用库中的方法,向您公开相同的功能。