当前位置: 首页 > 面试题库 >

PDO bindParam与执行

东门阳飇
2023-03-14
问题内容

我经常看到使用PDO bindParambindValue使用PDO的代码。是否只是execute出于某种原因而将论点转为皱眉?

我知道bindParam实际上绑定到了变量,并且可以设置两个bind方法都绑定的参数类型,但是如果仅插入字符串怎么办?

$query = "SELECT col1 FROM t1 WHERE col2 = :col2 AND col3 = :col3 AND col4 = :col4";
$pdo->bindValue(':col2', 'col2');
$pdo->bindValue(':col3', 'col3');
$pdo->bindValue(':col4', 'col4');

我经常看到上面的内容,但是我个人更喜欢:

$pdo->execute(array(':col2' => 'col2', ':col3' => 'col3', ':col4' => 'col4'));

它不是那么冗长,从视觉上来说,让输入“进入”查询对我来说更有意义。但是,我几乎看不到它的使用。

当您不必利用前者的特殊行为时,是否有理由更喜欢使用bind方法而不是传递参数execute


问题答案:

bindParam当您只想将变量引用绑定到查询中的一个参数时,您可能会发现它已使用,但可能仍需要对其进行一些操作,并且只希望在查询执行时计算出变量的值。它还允许您执行更复杂的操作,例如将参数绑定到存储过程调用,并将返回的值更新为绑定变量

例如

$col1 = 'some_value';
$pdo->bindParam(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_other_value' for ':col1' parameter

bindValue并传递一个数组,使其execute行为与参数值在该点被固定并相应执行SQL时几乎相同。

按照上面的相同示例,但使用 bindValue

$col1 = 'some_value';
$pdo->bindValue(':col1', $col1);
$col1 = 'some_other_value';
$pdo->execute(); // would use 'some_value' for ':col1' parameter

当直接传递值时,execute所有值都被视为字符串(即使提供了整数值)。因此,如果您需要强制执行数据类型,则应始终使用bindValuebindParam

我认为您可能会发现,bind*使用更多的execute(array)代码来更好地编码,以便在参数声明中显式定义数据类型。



 类似资料:
  • 问题内容: 和之间有什么区别 ? 问题答案: 从根本上说,它们执行相同的操作,这是提供一种在PL / SQL中执行DDL语句的机制,这是本机不支持的。如果内存对我有用,那么在Oracle 7版本的DBMS_UTILITY软件包中可以使用EXEC_DDL_STATEMENT,而在8中仅引入本机动态SQL(EXECUTE IMMEDIATE)。 有一些区别。EXECUTEIMMEDIATE主要是关于执

  • 问题内容: 他们俩都做同一件事,只是做事不同吗? 除了使用之间还有什么区别 和 ? 问题答案: 运行标准SQL语句,并要求您正确转义所有数据,以避免SQL注入和其他问题。 运行一个准备好的语句,该语句使您可以绑定参数,以避免需要转义或引用参数。如果您多次重复查询,效果也会更好。准备语句的示例: 最佳实践是坚持准备好的语句并提高安全性。

  • 问题内容: 我在理解同步关键字功能时遇到了一些麻烦。根据Java文档和其他教程,可以说,当使用synced关键字时,在两个线程之间不可能在该方法的语句之间进行交织。 但是,请参见下面的代码。 据我了解,程序输出应始终以线程0和线程1不应交错的方式进行。但是多次执行这段代码后,我得到了交错输出。 请帮助我理解问题。 提前致谢.. 问题答案: 的关键字防止两个线程运行的是在同一对象上同步代码。 您的每

  • Apache Spark:核心数与执行器数 由于每个案例都不一样,我又问了一个类似的问题。 我正在运行一个cpu密集型的应用程序,具有相同数量的核心和不同的执行器。以下是观察结果。 更新 案例3:执行器-12个,每个执行器的核心数-1个,执行器内存-3个,数据处理量-10 GB,分区-36个,作业持续时间:81分钟

  • 我有两个不同的方面类来计算测试程序执行的非静态方法调用的数量。第一个方面统计“调用”连接点上的方法: 第二个方面统计“执行”连接点上的方法: 是一个静态方法在计数器类。 小测试程序的方法调用次数相同。但是当我用一个更大的程序改变测试程序时,第二个方面类(带有执行切入点)中的方法调用数量比带有调用切入点的方面类中的方法调用数量多。这是合理的,因为呼叫连接点不会挑出用超级发出的呼叫,因此不会计算它们。

  • 最近,我使用了ThreadPoolExecutor和priorityqueue,并在将来遇到了这两种方法。对未来任务执行cancel()。和任务。remove(),将其从队列中移除。 更好的选择是什么?有什么区别吗?我可以保存两者的列表(从submit()接收的未来对象或任务本身),不确定要使用什么。。。 移除: 取消: 我使用了以下方法:http://docs.oracle.com/javase