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

Posted

技术标签:

【中文标题】如何确定从我的 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 【发布时间】:2020-03-05 11:01:00 【问题描述】:

我想动态确定从 html 输入表单中获取的输入值的数据类型。这将帮助我绑定使用 php 插入数据库的数据的参数值。

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

 if($stmt = $mysqli->prepare($sql)) 
    $stmt->bind_param("sss", $first_name, $last_name, $email);
 

我已经尝试了下面的代码,甚至尝试了 PHP 手册中使用call_user_func_array() 的一些其他代码,但都是徒劳的。

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

// 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”。我要构造的语句与此类似

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

【问题讨论】:

反正都是字符串,用s就行了 Dharman 是否意味着如果我为数据库中的整数数据指定类型 s 我不会出错? 感谢达曼。让我用这个字符串,看看我能走多远。 当你绑定一个参数时,你正在根据用户输入在你的数据库中查找一些字段。您应该已经知道类型;这是您要查找的字段的类型。 嗨,Ice,我想使用一个类,该类将被许多具有不同数据类型和列的表使用。我不会提前知道数据类型。 【参考方案1】:

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

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

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

【讨论】:

Scott 非常感谢您提供这些信息,让我使用它,看看我能走多远。【参考方案2】:

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

最好的方法是测试它。

$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 的数字上下文中使用它们,那么在 MySQLi bind_param() 中没有理由将它们转换为字符串。

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

$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() - specify another data type than “s” for each parameter

对于二进制或 blob,它们只是二进制字符串。这意味着它们没有字符集,并且排序和比较基于列值中字节的数值。 如果你发现自己需要插入一个 blob 值,它很可能不是来自 HTML 表单作为字符串,而是来自读取文件,你会知道你需要使用 b

【讨论】:

查询参数总是像一个常量值,而不是一个列标识符。 ORDER BY 'string' 是合法的,因为您可以使用任何表达式进行排序,包括只有单个常量值的表达式。但是这样的表达式对于它尝试排序的每一行都有相同的值,所以它们都会被绑定,然后顺序将是任意的。 @BillKarwin 没错,这就是为什么 2'2'ORDER BY 中被 MySQL 区别对待的原因。这就是设置正确类型完全有意义的地方。 哦,是的,我明白你的意思了,因为ORDER BY 接受一个序数列号。虽然这种用法已被弃用并且语法已从 SQL 标准中删除,但我们不应该使用它。

以上是关于如何确定从我的 html 表单获取的输入值的数据类型,以便我可以使用它们在准备好的语句中绑定参数的主要内容,如果未能解决你的问题,请参考以下文章

html 表单返回空对象而不是输入数据| Vue

如何通过jQuery / Javascript获取更新的表单输入值?

如何使用JavaScript / JQuery显示表单中所有HTML输入值的摘要?

自动更新文本框

如何在自动生成的for循环中从html表单中获取唯一值

matInput 如何设置值