Bind Param - 多值数据 - VarChar

Bind Param - Multi Value Data - VarChar

提问人:Antonio 提问时间:11/1/2023 更新时间:11/2/2023 访问量:42

问:

我正在尝试学习准备好的语句和绑定参数。pHp 手册中的代码

我具体查看的是以下代码:

mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("example.com", "user", "password", "database");

$mysqli->query("DROP TABLE IF EXISTS test");
$mysqli->query("CREATE TABLE test(id INT)");

$values = [1, 2, 3, 4];

$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?), (?), (?), (?)");
$stmt->bind_param('iiii', ...$values);
$stmt->execute();

我收集的是 bind_param() 中,您需要相应地为每个值包含一个“i”表示整数或一个“s”表示字符串,很可能是按确切的顺序。(如果我的假设是错误的,请纠正我)

我的主要问题是我需要做些什么才能将整数和字符串 (VarChar) 都存储到数据库中?“s”就足够了吗?另外,特殊字符呢?这也有bind_param吗?或者“s”会像 Varchar 一样读出数据库中的密码吗?

另外,作为奖励,有人可以解释一下这三个......在 $values 变量之前:

$stmt->bind_param('iiii', ...$values);

我假设每个点都是一个值,最终值是变量本身?

关于这段代码,我想知道的最后一件事是:

$mysqli = new mysqli("example.com", "user", "password", "database");

mysqli() 函数之前的“new”。这对于准备好的陈述真的有必要吗?

(“我尝试了什么,我期待什么?我实际上还没有尝试过这样的事情,在我决定重写我的整个登录/注册码之前,我会问这个问题。我决定我更喜欢使用准备好的语句而不是 mysqli_query(),因为我听说它容易受到SQL_Injections以我目前的方式编码的影响。我想做的是将准备好的语句用于多个值。我需要更多关于存储 VarChar 的信息,以及这是否真的是一种更好或更安全的方法。

PHP 数据库 安全 mysqli

评论

1赞 CBroe 11/1/2023
你不需要做假设,你可以在方法的详细说明中阅读它:php.net/manual/en/mysqli-stmt.bind-param.php
1赞 CBroe 11/1/2023
“我假设每个点都是一个值,最终值是变量本身?”- 这就是点差运算符的使用, wiki.php.net/rfc/spread_operator_for_array,stackoverflow.com/q/45419150/1427878
0赞 Antonio 11/2/2023
@CBroe我检查了你的链接。在我看来,扩展运算符实际上是对数组或多值对象的调用?
1赞 CBroe 11/2/2023
是的,这将是一种可能的应用。
1赞 CBroe 11/2/2023
那个是一个函数,而不是一个类,在这种情况下,关键字是没有意义的。这基本上是两种不同的编程原则——面向对象的编程原理与过程编程原理。new

答:

1赞 Antonio 11/2/2023 #1

@CBroe提供了答案:

问题 1:我应该对 varchar 使用哪个指针?

答案1:Bind_Param PhP手册

  • i - 整数
  • s - 字符串
  • d - 十进制
  • b - 斑点

对于 varchar 类型的数据,字符串是可以的。

问题2:这三个点有什么作用?(...$values)

答案 2:spread 运算符可以将数组或列表读出到值集中。(至少这是 1 次使用点差运算符)

问题 3:“new”关键字有什么作用,正确使用准备好的语句是否需要它?

答案 3:如果使用函数而不是类,则不需要“new”。面向对象与过程是区别。