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

以下是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代码。

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

如果你正试图做你听起来像你想做的事情……不要试图这样做。

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

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

准备好的陈述与陈述一致? 服务器的占位符按原样,服务器“准备”执行语句…然后客户端将参数发送到服务器(“绑定”参数)以便执行。 这样做,服务器永远不会混淆“哪个部分是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通信,那么您应该调用库中的方法,向您公开相同的function。