来自http://php.net/manual/en/mysqli.quickstart.prepared-statements.php的正确MySQLi参数化查询语法:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (?)");
$stmt->bind_param("i", $id);
但永远不要这样:
$stmt = $mysqli->prepare("INSERT INTO test(id) VALUES (:id_value)");
$stmt->bind_param("i", "id_value", $id);
在我看来,命名参数替换是在API级别实现的合理功能。令我惊讶的是,MySQLi 在库中只实现了 未命名参数。
有正当理由吗?看到 PDO、DQL、ORM 都如何在查询中采用命名参数,这对我来说没有意义。
我希望 MySQLi 开发人员不会出现“我们很懒且不想”的情况。我相信一定有一个很好的理由,并且我正在寻找那个理由,或者寻找那个理由的方法。 MySQLi 扩展库中未实现命名参数的原因。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号
MYSQLi不支持命名参数有两个主要原因:PDO确实如此 - 而且没有必要重新发明轮子详细说明第 1 点:
mysqli,尽管与PDO相比有许多缺点,但很容易与一个好的包装器相媲美 - 即命名参数(除其他外) )由包装器而不是 mysqli 本身支持。这是设计使然,只有一个原因:Mysqli被设计为一个快速且灵活的库。如果开发人员将更多功能合并到基础库中,与直觉相反,它就会变得不太灵活,并且需要更长的加载/执行时间。
mysqli和pdo都是随 PHP 5 发布的(我相信 PDO 版本为 5.3),因此有不同的用途。您想要更快的执行时间吗?使用没有包装器的
mysqli。您想要命名参数吗?使用PDO或构建mysqli包装器来处理此类问题 - 但请注意,这会阻碍您的执行时间。