【发布时间】:2017-01-09 13:50:35
【问题描述】:
我试图在我的数据库中插入一些东西,我决定用两种不同的方式来查看查询性能。
我用过 (end_microtime - starting_microtime) 的方式来查看正在发生的事情。
绑定参数代码:
<?php
timer_start = microtime(TRUE);
$db = @new mysqli('localhost','root','','database');
$username = "username";
$email= "test@html.com";
$password = "123456789";
$query = "INSERT INTO users (username,email,password) VALUES (?,?,?)";
$stmt = $db->prepare($query);
$stmt->bind_param("sss", $username, $email, $password);
$stmt->execute();
$stmt->close();
$timer_end = microtime(TRUE);
echo($timer_end - $timer_start);
?>
结果:~ 0.090020895004272
mysqli_query 代码(我现在改之前有语法错误)
<?php
$timer_start = microtime(TRUE);
$db = @new mysqli('localhost','root','','database');
$username = "username";
$email= "asdf@ghj.com";
$password = "123456789";
$query = "INSERT INTO users (username,email,password)
VALUES ('$username','$email','$password')";
mysqli_query($db,$query);
$timer_end = microtime(TRUE);
echo($timer_end - $timer_start);
?>
结果 = ~ 0.00070500373840332
问题是:为什么会这样?
【问题讨论】:
-
问题是?
-
因为连接器必须处理绑定并确定需要引用、转义和清理哪些变量。直接查询是盲插入,因此不需要处理,但对于 SQL 注入也是开放的。那么你想要快速还是安全?
-
在您的第二个示例中,您没有引用这些值。并且没有关闭连接。
-
@aynber 这是一个很好的答案。谢谢你。但是我想问一下如果 1000 个并发用户尝试向数据库输入内容会发生什么?
-
@aynber 这些变量永远不会被引用、转义和清理,所以你的假设显然是错误的。而且它并没有解释这么大的差异。
标签: php mysql mysqli pdo bindparam