Questions tagged «prepared-statement»

预处理语句(或参数化语句)是一种预编译的SQL语句,用于提高性能和减轻SQL注入攻击。预准备的语句在许多流行的关系数据库管理系统中使用。

21
我可以将数组绑定到IN()条件吗?
我很好奇是否可以使用PDO将值数组绑定到占位符。这里的用例正在尝试传递值数组以与IN()条件一起使用。 我希望能够执行以下操作: <?php $ids=array(1,2,3,7,8,9); $db = new PDO(...); $stmt = $db->prepare( 'SELECT * FROM table WHERE id IN(:an_array)' ); $stmt->bindParam('an_array',$ids); $stmt->execute(); ?> 并让PDO绑定并引用数组中的所有值。 目前,我正在做: <?php $ids = array(1,2,3,7,8,9); $db = new PDO(...); foreach($ids as &$val) $val=$db->quote($val); //iterate through array and quote $in = implode(',',$ids); //create comma separated list $stmt = …

30
PreparedStatement IN子句替代项?
结合使用SQL IN子句和实例的最佳解决方法java.sql.PreparedStatement是什么,由于SQL注入攻击安全性问题,多个值不支持该子句:一个?占位符代表一个值,而不是值列表。 考虑以下SQL语句: SELECT my_column FROM my_table where search_column IN (?) 使用preparedStatement.setString( 1, "'A', 'B', 'C'" );本质上是一种不可行的尝试,它是首先解决使用原因的方法?。 有哪些解决方法?

6
在准备好的语句中使用“ like”通配符
我正在使用准备好的语句来执行mysql数据库查询。我想基于各种关键字实现搜索功能。 为此,我需要使用LIKE关键字,这一点我知道很多。而且我之前也使用过预处理语句,但是我不知道如何使用它,LIKE因为从以下代码中,我将在哪里添加'keyword%'? 我可以直接在pstmt.setString(1, notes)as (1, notes+"%")或类似的东西中使用它吗?我在网络上看到很多帖子,但在任何地方都没有好的答案。 PreparedStatement pstmt = con.prepareStatement( "SELECT * FROM analysis WHERE notes like ?"); pstmt.setString(1, notes); ResultSet rs = pstmt.executeQuery();

9
准备好的语句如何防止SQL注入攻击?
准备好的语句如何帮助我们防止SQL注入攻击? 维基百科说: 准备好的语句可以抵御SQL注入,因为稍后需要使用其他协议传输的参数值不需要正确地转义。如果原始语句模板不是从外部输入派生的,则不会发生SQL注入。 我不太清楚原因。用简单的英语和一些例子,简单的解释是什么?

13
如何获取PreparedStatement的SQL?
我有一个带有以下方法签名的常规Java方法: private static ResultSet runSQLResultSet(String sql, Object... queryParams) 它将打开一个连接,PreparedStatement使用sql语句和queryParams可变长度数组中的参数构建一个,运行它,然后将ResultSet(CachedRowSetImpl),关闭连接,然后返回缓存的结果集。 我在记录错误的方法中有异常处理。我将sql语句记录为日志的一部分,因为它对调试非常有帮助。我的问题是,记录String变量会sql记录带有?而不是实际值的模板语句。我想记录实际已执行(或尝试执行)语句。 所以...有什么方法可以获取将由a运行的实际SQL语句PreparedStatement?(没有自己构建它。如果我找不到访问PreparedStatement'sSQL的方法,我可能最终会在自己的catches中最终构建它。)

22
已准备好PDO在单个查询中插入多行
我目前在MySQL上使用这种类型的SQL在单个查询中插入多行值: INSERT INTO `tbl` (`key1`,`key2`) VALUES ('r1v1','r1v2'),('r2v1','r2v2'),... 关于PDO的阅读,使用准备好的语句应该比静态查询为我提供更好的安全性。 因此,我想知道是否可以使用准备好的语句生成“通过使用一个查询插入多行值”。 如果是,请问我该如何实施?


1
mysqli_fetch_assoc()期望参数/调用成员函数bind_param()错误。如何获取并修复实际的mysql错误?
在我的本地/开发环境中,MySQLi查询执行正常。但是,当我将其上载到Web主机环境时,出现以下错误: 致命错误:在...中的非对象上调用成员函数bind_param() 这是代码: global $mysqli; $stmt = $mysqli->prepare("SELECT id, description FROM tbl_page_answer_category WHERE cur_own_id = ?"); $stmt->bind_param('i', $cur_id); $stmt->execute(); $stmt->bind_result($uid, $desc); 为了检查我的查询,我尝试通过控制面板phpMyAdmin执行查询,结果没有问题。


2
多次重用PreparedStatement
在使用带有单个公共连接且没有任何池的PreparedStatement的情况下,我可以为每个具有预准备语句功能的dml / sql操作重新创建一个实例吗? 我的意思是: for (int i=0; i<1000; i++) { PreparedStatement preparedStatement = connection.prepareStatement(sql); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); preparedStatement.close(); } 代替: PreparedStatement preparedStatement = connection.prepareStatement(sql); for (int i=0; i<1000; i++) { preparedStatement.clearParameters(); preparedStatement.setObject(1, someValue); preparedStatement.executeQuery(); } preparedStatement.close(); 我的问题是我想将此代码放入多线程环境中,您能给我一些建议吗?谢谢

6
Java:使用PreparedStatement将多行插入MySQL
我想使用Java一次在MySQL表中插入多行。行数是动态的。过去我在做... for (String element : array) { myStatement.setString(1, element[0]); myStatement.setString(2, element[1]); myStatement.executeUpdate(); } 我想对此进行优化,以使用MySQL支持的语法: INSERT INTO table (col1, col2) VALUES ('val1', 'val2'), ('val1', 'val2')[, ...] 但由于PreparedStatement我不知道有什么方法可以这样做,因为我事先不知道array将包含多少个元素。如果无法使用PreparedStatement,我该怎么办(仍然对数组中的值进行转义)?

5
PreparedStatement setNull(..)
Java PreparedStatement提供了显式设置Null值的可能性。这种可能性是: prepStmt.setNull(parameterIndex, Types.VARCHAR); 此调用的语义是否与使用带有null参数的特定setType时的语义相同? prepStmt.setString(null); ?


8
PHP-将PDO与IN子句数组一起使用
我正在使用PDO执行一条语句,该语句的IN子句使用数组作为其值: $in_array = array(1, 2, 3); $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (".$in_values.")"); $my_result->execute(); $my_results = $my_result->fetchAll(); 上面的代码工作得很好,但是我的问题是为什么不能: $in_array = array(1, 2, 3); $in_values = implode(',', $in_array); $my_result = $wbdb->prepare("SELECT * FROM my_table WHERE my_value IN (:in_values)"); $my_result->execute(array(':in_values' => $in_values)); $my_results = $my_result->fetchAll(); …

3
我的无效字符在哪里(ORA-00911)
我正在尝试将CLOBs插入数据库(请参阅相关问题)。我不太清楚怎么了。我有大约85个要插入表中的块的列表。即使只插入第一个Clob,我也会得到ORA-00911: invalid character。我无法弄清楚PreparedStatement在执行之前如何从语句中删除该语句,因此我不能100%地确定它是正确的,但是如果我正确,那么它应该看起来像这样: insert all into domo_queries values ('select substr(to_char(max_data),1,4) as year, substr(to_char(max_data),5,6) as month, max_data from dss_fin_user.acq_dashboard_src_load_success where source = ''CHQ PeopleSoft FS''') select * from dual; 最终,该insert all语句将包含多个into',这就是为什么我不执行常规insert语句的原因。我没有看到无效字符,对吗?(哦,当我在sql开发人员工具中运行该代码时,上述代码运行良好。)而且,如果我删除了中的分号PreparedStatement,则会引发ORA-00933: SQL command not properly ended错误。 无论如何,这是我用于执行查询的代码(以及上面示例中变量的值)。 public ResultSet executeQuery(String connection, String query, QueryParameter... params) throws DataException, SQLException { // query …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.