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

如何在PDOStatement :: bindValue()中定义变量类型?

武嘉祥
2023-03-14
问题内容

的PDOStatement对象::
bindValue()
方法提供了一种方式来指定绑定的变量的类型:

PDOStatement :: bindValue($ parameter,$ value [, $ data_type = PDO ::
PARAM_STR
])

我想知道,指定数据类型的目的是什么,而当保留为默认值(PARAM_STR)时,最终数据库将在使用它之前将值强制转换为正确的类型?

例如,如果您对某个INTEGER字段有以下查询:

INSERT INTO table (integerField) VALUES (?) ;
SELECT * FROM table WHERE integerField = ?  ;

并且您在PHP中绑定了一个整数,默认情况下,PDO会将其绑定为一个字符串,这等效于:

INSERT INTO table (integerField) VALUES ("1") ;
SELECT * FROM table WHERE integerField = "1"  ;

这将完美地工作,因为SQL数据库(至少是MySQL,我并不真正了解在其他RDBMS上的工作方式)知道如何在使用字符串之前将其转换回整数。

在哪些用例中,绑定类型参数和字符串会有所不同?


问题答案:

我不是PDO专家,但是我可以想到一些场景,其中data_type参数既有用又需要。

输出参数

定义输出或输入/输出参数时,必须同时提供预期输出参数的类型和长度。

参考:http :
//www.php.net/manual/zh/pdo.prepared-
statements.php

例子#4

$stmt = $dbh->prepare("CALL sp_returns_string(?)");
$stmt->bindParam(1, $return_value, PDO::PARAM_STR, 4000);

范例#5

$stmt = $dbh->prepare("CALL sp_takes_string_returns_string(?)");
$value = 'hello';
$stmt->bindParam(1, $value, PDO::PARAM_STR|PDO::PARAM_INPUT_OUTPUT, 4000);

没有隐式强制转换的DBM

在对此问题的另一个答案中进行了解释…

当参数未绑定到可转换数据时

即使具有转换能力的数据库也无法始终正确转换变量。

参考:在PDO中强烈键入参数的原因?

$limit = 1;

$dbh->prepare("SELECT * FROM items LIMIT :limit");
$dbh->bindParam(":limit", $limit, PDO::PARAM_STR); 
// Will throw "You have an error in your SQL syntax..."


 类似资料:
  • 问题内容: 在我的 Dockerfile中 ,我想 定义 稍后 可以 在Dockerfile中使用的变量 。 我知道该指令,但是我不希望这些变量是环境变量。 有没有一种方法可以 在Dockerfile范围内声明变量 ? 问题答案: 您可以使用-请参阅https://docs.docker.com/engine/reference/builder/#arg 该指令定义了一个变量,用户可以在构建时使用

  • 有没有一种方法可以在Dockerfile范围声明变量?

  • 问题内容: 在Coffeescript.org上: 将编译为: 通过在node.js下的coffee-script进行编译可以做到: 文件说: 如果要创建供其他脚本使用的顶级变量,请将它们作为属性附加到窗口或CommonJS中的exports对象上。如果您同时针对CommonJS和浏览器,那么存在运算符(见下文)为您提供了一种可靠的方法来确定将它们添加到何处:root = exports?这个 然

  • 问题内容: 在Swift中是否有确定变量类型的函数?我想可能会有类似Python的东西。 我想一种判断变量是Swift中的Foundation对象还是C变量的方法。就像NSString vs String,或NSArray vs array。这样我就可以在控制台中注销并清楚地看到它是什么。 例如,我想知道下面第一个推断的类型: 在这个问题中,我已经看到判断 给定 变量是否是 给定 类型的答案,但我

  • 问题内容: 我知道标准示例:如果直接执行模块,则其全局变量定义为。但是,在文档的任何地方都找不到关于一般情况下如何定义的精确描述。该模块的文件说… 在模块内,模块名称(作为字符串)可用作全局变量的值。 …但是“模块名称”是什么意思?它仅仅是模块的名称(已删除的文件名),还是包括标准的软件包名称? 如何确定Python模块中变量的值?为了获得加分,请准确指出此操作在Python源代码中的何处执行。

  • 问题内容: 假设您需要定义一个仅包含常量的类。 这样做的首选方式是什么? 接口 抽象类 最终班 我应该使用哪一个?为什么? 澄清一些答案: 枚举 -我将不使用枚举,我不会枚举任何东西,只是收集一些彼此不相关的常量。 接口 -我不会将任何类设置为实现该接口的类。只是想使用该接口来调用常量,例如:。 问题答案: 使用期末课程。为简单起见,您可以使用静态导入在另一个类中重用您的值 在另一堂课中: