关于php:如何确定从html表单获取的输入值的数据类型,以便可以使用它们在准备好的语句中绑定参数

How do I determine datatype of input values that am getting from my html form so that I can use them to bind parameters in prepared statement

我想动态确定从HTML输入表单获取的输入值的数据类型,这将有助于我绑定要使用PHP插入数据库中的数据的参数值。

此信息将帮助我确定字符串'sss'的值
在下面的MySQL预准备语句代码中,我想创建一个插入数据类,并且输入值的类型可以为字符串,双精度,整数或Blob类型的'sdib'。

1
2
3
 if($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param("sss", $first_name, $last_name, $email);
 }

我尝试了以下代码,甚至尝试了徒劳地使用call_user_func_array()的PHP手册中的其他一些代码。

我了解HTML表单的输入值始终是字符串。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// SECTION USING PREPARED STATEMENT IN INSERT QUERY
if ($stmt = $mysqli->prepare($sql)) {
    $stmt->bind_param("sss", $first_name, $last_name, $email);
}

//CODE SHOWING HOW I AM TRYING TO GET DATA TYPE OF HTML INPUT VALUES
if (gettype($v) ==="string") {
    return"s";
} elseif (gettype($v) ==="float") {
    return"d";
} elseif (gettype($v) ==="integer") {
    return"i";
} elseif (gettype($v) ==="binary") {
    return"b";
} else {
    $e = '..could not establish data type';
    $this->setError($e);
    echo $e;
}

我希望能够从HTML输入表单中动态获取数据类型部件'sss'。我要构造的语句与此

类似

1
$stmt->bind_param("sddsii", $first_name, $last_name, $email);


在另一个答案中指出,所有来自HTML的值都是字符串。但是,您可能有来自其他来源的输入,您希望将这些输入传递给语句。如果一直使用字符串绑定会发生什么?

最好的方法是对其进行测试。

1
2
3
4
5
6
7
8
$data1 = '1';
$data2 = 2;
$data3 = '0.5-a';
$stmt = $mysqli->prepare('SELECT ?=1 AS f1, ?="2" AS f2, ?=0.5 AS f3');
$stmt->bind_param('sss', $data1, $data2, $data3); // binding string
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
var_dump($row); // all true

在这些简单的示例中,没有区别。为什么?因为如果在数字上下文中使用MySQL,MySQL会将字符串转换为适当的类型。

如果几乎??所有内容都可以作为字符串发送,为什么要明确指定类型?
因为如果您知道值的数据类型,则不应该来回转换它们。如果您有整数,并且在数字上下文中在MySQL中使用它们,则没有理由在MySQLi bind_param()中将它们强制转换为字符串。

另一个重要的用例是MySQL确实在类型上有所区别,例如在ORDER BY子句中。如果您绑定字符串而不是数字,则顺序将有所不同。 MySQL可以采用表示SELECT中列号的序数或列名(不能绑定)或字符串文字。

1
2
3
4
$data1 = '2';
// I want the records to be ordered by `name`, which is the second column
$stmt = $mysqli->prepare('SELECT id, name FROM products ORDER BY ?');
$stmt->bind_param('i', $data1); // binding integer instead of string

相关文章:mysqli_stmt :: bind_param()-为每个参数指定除" s"之外的另一种数据类型

当涉及二进制或blob时,它们只是二进制字符串。这意味着它们没有字符集,并且排序和比较基于列值中字节的数字值。
如果您发现自己需要插入blob值,则该值很可能不是来自HTML形式的字符串,而是来自读取文件,并且您会知道需要使用b


我想动态确定我从HTML中获取的输入值的数据类型

HTML中的" T"代表"文本"。 HTML中只有一种数据类型,即字符串。接收来自HTML的输入的任何代码都必须已经知道要使用哪种数据类型,并将字符串输入转换为该类型。

例如,如果您的数据库希望用户的年龄为整数,那么当您的代码收到该用户输入(字符串)时,它必须将其转换为整数,然后将该整数传递到数据库中。铅>