标签: prepared-statement

当*不*使用准备好的陈述?

我正在重新设计一个使用最小数据库的PHP驱动的网站.原始版本使用"伪准备语句"(PHP函数进行引用和参数替换)来防止注入攻击并将数据库逻辑与页面逻辑分开.

用一个使用PDO和真实预处理语句的对象替换这些ad-hoc函数似乎很自然,但在阅读它们之后,我不太确定.PDO似乎仍然是一个好主意,但准备好的声明的主要卖点之一是能够重用它们......我永远不会.这是我的设置:

  • 这些陈述都非常简单.大多数是在形式SELECT foo,bar FROM baz WHERE quux = ? ORDER BY bar LIMIT 1.该批次中最复杂的陈述只是三个这样的选择与UNION ALLs 连接在一起.
  • 每个页面命中至多执行一个语句并仅执行一次.
  • 我处于托管环境中,因此通过亲自进行任何"压力测试"来抨击他们的服务器.

鉴于使用准备好的语句至少会使我正在进行的数据库往返次数增加一倍,我最好避免使用它们吗?我是否可以使用PDO::MYSQL_ATTR_DIRECT_QUERY以避免多个数据库跳闸的开销,同时保留参数化和注入防御的好处?或者,与执行我不应该担心的非准备查询相比,准备好的语句API使用的二进制调用是否运行良好?

编辑:

伙计们,感谢所有好的建议.这是我希望我可以将多个答案标记为"已接受"的地方 - 许多不同的观点.不过,最终,我必须给rick他应得的......如果没有他的答案,我会幸福地离开并完成错误的事情,即使遵循了所有人的建议.:-)

仿真准备好的陈述吧!

php mysql pdo prepared-statement

34
推荐指数
5
解决办法
1万
查看次数

在JDBC中,为什么预处理语句的参数索引从1开始而不是0?

在Java的其他任何地方,索引的任何东西都从0开始.这里是否有改变的原因或者这只是糟糕的设计?

java indexing jdbc prepared-statement

34
推荐指数
2
解决办法
9606
查看次数

preparedStatement是否避免SQL注入?

我已阅读并尝试将易受攻击的SQL查询注入我的应用程序.这不够安全.我只是使用Statement Connection进行数据库验证和其他插入操作.

preparedStatements安全吗?而且这个陈述也会有问题吗?

java sql-injection jdbc prepared-statement

34
推荐指数
1
解决办法
3万
查看次数

存储过程与准备语句之间的差异?

存储过程和准备语句之间有什么区别......哪一个更好,为什么...... !! 我试图谷歌但没有更好的文章......

stored-procedures prepared-statement

34
推荐指数
3
解决办法
3万
查看次数

SQLite/C#连接池和准备语句混淆

我花了一些时间专门为数据库和SQLite阅读不同的最佳实践.在阅读时我发现我做了很多我不应该做的事情,在尝试修复这些问题时,我在考虑使用SQLite及其ADO实现的一些更精细的细节时感到困惑.

我的困惑源于准备好的陈述和连接池.

在阅读http://msdn.microsoft.com/en-us/library/ms971481.aspx时,我发现只应为事务打开连接.交易完成后,应关闭连接.我没有牢牢掌握为什么会这样,但我一直在假设作者知道的比我更好.我明白当连接关闭时并不意味着它实际上已经存在已经关闭.它只是意味着它已被放回池中.

现在,为了改进我的查询和插入,我阅读了有关使用预准备语句 在SQLite中,准备好的语句真的能提高性能吗?http://petesbloggerama.blogspot.com/2007/02/sqlite-adonet-prepared-statements.html似乎都表明,当执行多次执行的查询时,准备好的语句是可行的.我还读过,预准备语句特定于连接,并且一旦连接关闭,预准备语句就会丢失.

我的困惑是这个.如果我打开和关闭我的连接(可能或不可能意味着由于线程池而关闭连接)那么我从准备好的声明中获得了多少用处?我可以理解,如果我有1000个对象,我需要在单个事务中保存,准备好的语句可以帮助很多.但是我不相信我会看到在事务中保存单个对象会带来好处,因为一旦我关闭了连接,从第一个对象生成的预准备语句现在就会丢失.这是真实的陈述吗?

我相信准备好的语句与我的SQLiteCommand对象的范围有关,这进一步加剧了我的困惑.

如果我创建一个表示我将经常执行的查询的SQLiteCommand,我是否需要将SQLiteCommand保留在内存中以使预准备语句保持活动状态?

如果我用相同的SQLite语句创建一个新的SQLiteCommand,它是否认识到新的SQLiteCommand与前一个相同,因此有一个可以使用的预准备语句?

如果我在内存中保留一个SQLiteCommand并更改它的参数和连接,因为我打开并关闭不同事务的连接,我基本上在不同的连接之间保持一个准备好的语句?

我很可能在这一点上思考问题,但我希望你能帮助我更好地理解这些事情是如何相互作用的,这样我才能从中获益最多.

c# sqlite connection-pooling prepared-statement

32
推荐指数
2
解决办法
1万
查看次数

返回受Java中SQL UPDATE语句影响的行数

我正在使用MySQL数据库并通过Java访问它.

PreparedStatement prep1 = this.connection.prepareStatement("UPDATE user_table 
                                                               SET Level = 'Super' 
                                                             WHERE Username = ?");
prep1.setString(1, username);
Run Code Online (Sandbox Code Playgroud)

上面的更新语句工作正常,但是我想获得受此语句影响的行数.这可能吗?

java mysql sql prepared-statement rowcount

31
推荐指数
3
解决办法
7万
查看次数

如何使用带有PHP的Prepared Statement插入到mysql中

所以我只是在学习数据库,我希望能够存储用户输入.有人能给我一个基本的例子来说明如何使用php获取表单数据并将其保存到数据库中吗?还使表单免受sql攻击

php mysql mysqli prepared-statement

31
推荐指数
1
解决办法
4万
查看次数

PHP PDO :: bindParam()数据类型..它是如何工作的?

我想知道bindParam()(或bindValue())中的数据类型声明用于...

我的意思是,我认为如果我定义一个整数参数(PDO::PARAM_INT),必须将参数转换为整数,类似于

$delete->bindParam(1, $kill, PDO::PARAM_INT);
// should work like
$delete->bindParam(1, (int)$kill);
Run Code Online (Sandbox Code Playgroud)

或者如果参数不是声明的类型,至少抛出一个错误.但这种情况并非如此.

谷歌搜索,我发现在php.net档案:

大家好,

我目前正在研究PDO.正好在bindParam()函数上.第三个参数data_type似乎在这里强制值的类型?但是当我尝试:

$sql = "INSERT INTO produit (idproduit, nom, marque) VALUES (NULL, :nom, :marque)";
$stmt = $dbh->prepare($sql);
$nom = 'Testarossa'; $marque = 'Ferrari' ;
$stmt->BindValue(':marque',$marque) ;
$stmt->BindParam(':nom',$nom,PDO::PARAM_INT) ;

$stmt->execute(); $nom = '250 GTO' ;
$stmt->execute(); ?>
Run Code Online (Sandbox Code Playgroud)

我希望在我的数据库中有PHP错误或整数.但在我的数据库中我有:

22 Testarossa Ferrari 23 250 GTO法拉利

这意味着如果我有第三个参数,它不会改变.或许我想念一些东西.有人能容忍我吗?或者只是有人告诉我在哪里可以找到有关它的信息.

问候,

Cyruss

这正是我的情况.我的想法出了什么问题?

php pdo types prepared-statement

30
推荐指数
3
解决办法
2万
查看次数

使用预准备语句批量更新在Java中批量插入

我试图用Java填充一个带有大约50,000行10列的结果集,然后使用batchExecute方法将它们插入到另一个表中PreparedStatement.

为了使这个过程更快,我做了一些研究,发现在将数据读入resultSet时,fetchSize起着重要的作用.

拥有一个非常低的fetchSize可能导致太多的服务器访问,并且非常高的fetchSize可以阻止网络资源,所以我尝试了一点,并设置了适合我的基础设施的最佳大小.

我正在读取此resultSet并创建插入语句以插入到另一个数据库的另一个表中.

像这样的东西(只是一个样本,而不是真正的代码):

for (i=0 ; i<=50000 ; i++) {
    statement.setString(1, "a@a.com");
    statement.setLong(2, 1);
    statement.addBatch();
}
statement.executeBatch();
Run Code Online (Sandbox Code Playgroud)
  • executeBatch方法是否会尝试一次发送所有数据?
  • 有没有办法定义批量大小?
  • 有没有更好的方法来加快批量插入的过程?

在批量更新(50,000行10列)时,使用可更新ResultSet或PreparedStaement批量执行是否更好?

java bulkinsert resultset prepared-statement

30
推荐指数
2
解决办法
7万
查看次数

如何使用arraylist作为预准备语句参数

我已经看过了,并且无法找到我正在接受的以下挑战的答案.这似乎很简单但我无法解决它.

我有一个ArrayList类型为Long- > 的记录ID ArrayList<Long>.我想使用此记录ID列表来从另​​一个表中选择行.到现在为止还挺好.现在迎接挑战......

a)我正在使用预准备语句,使用ArrayListas输入从表中选择数据.

selectPS = dbConnection.prepareStatement("select columnA from tableA where id in ?");
Run Code Online (Sandbox Code Playgroud)

关于上述问题 - 如何定义参数?以上对于ArrayList类型参数似乎不正确.

b)在为预准备语句设置参数值时,我也遇到了问题.没有设置ArrayList类型值的方法,我看不到其他可行的选项.

---> selectPS.set?????(1, arraylistParameter);
     ResultSet rs = selectPS.executeQuery(); 
Run Code Online (Sandbox Code Playgroud)

我们非常感谢您给我的任何帮助或指导.

谢谢.

java arraylist prepared-statement

30
推荐指数
2
解决办法
9万
查看次数