以下是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代码。
答案 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通信,那么您应该调用库中的方法,向您公开相同的功能。