使用 PHP 和 MySQL 准备的语句,而不使用 mysqli

发布于 2024-08-19 09:13:50 字数 100 浏览 1 评论 0原文

我想知道是否可以使用 mysql 库而不是 mysqli 库使用 PHP 和 MySQL 创建准备好的语句。

我在 PHP 文档中找不到任何内容。

谢谢。

I'd like to know if it is possible to create a prepared statement with PHP and MySQL using the mysql library rather than the mysqli library.

I can't find anything on the PHP documentation.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

貪欢 2024-08-26 09:13:50

PHP 文档非常清楚地指出(在该页面的末尾)mysql 扩展支持准备好的语句。支持准备好的语句的 mysqli 的替代方案是 PDO_MYSQL

The PHP documentation quite clearly states (at the end of that page) that the mysql extension does not support prepared statements. An alternative to mysqli that supports prepared statements would be PDO_MYSQL.

站稳脚跟 2024-08-26 09:13:50

为什么要使用准备好的语句?

如果您担心 SQL 注入,您可以随时推出自己的注入:

$fname = "Robert'); DROP TABLE students;--";
$lname = "Smith";

$pureSql = "SELECT FROM `users` WHERE `fname` = '$fname'   AND `lname` = '$lname'";
$prepSql = "SELECT FROM `users` WHERE `fname` = :userfname AND `lname` = :userlname";

echo $pureSql, "\n";
echo prepare($prepSql, array('userfname' => $fname, 'userlname' => $lname)), "\n";

function prepare($sql, $params=array()){

    if(strlen($sql) < 2 || count($params) < 1){
        return $sql;
    }

    preg_match_all('/\:[a-zA-Z0-9]+/', $sql, $matches);

    $safeSql = $sql;
    foreach($matches[0] as $arg){
        if(array_key_exists(ltrim($arg, ':'), $params)){
            $safeSql = str_replace($arg, "'" . mysql_real_escape_string($params[ltrim($arg, ':')]) . "'", $safeSql);
        }
    }

    return $safeSql;

} //prepare()

输出为:

SELECT FROM users WHERE fname = 'Robert');删除表学生;--' AND lname = 'Smith'
users 中选择,其中 fname = 'Robert\');删除表学生;--' AND lname = 'Smith'

编辑:忘记了 xkcd 链接 http ://xkcd.com/327/

Why do you want to use a Prepared Statement?

If SQL injection is your concern you could always roll your own:

$fname = "Robert'); DROP TABLE students;--";
$lname = "Smith";

$pureSql = "SELECT FROM `users` WHERE `fname` = '$fname'   AND `lname` = '$lname'";
$prepSql = "SELECT FROM `users` WHERE `fname` = :userfname AND `lname` = :userlname";

echo $pureSql, "\n";
echo prepare($prepSql, array('userfname' => $fname, 'userlname' => $lname)), "\n";

function prepare($sql, $params=array()){

    if(strlen($sql) < 2 || count($params) < 1){
        return $sql;
    }

    preg_match_all('/\:[a-zA-Z0-9]+/', $sql, $matches);

    $safeSql = $sql;
    foreach($matches[0] as $arg){
        if(array_key_exists(ltrim($arg, ':'), $params)){
            $safeSql = str_replace($arg, "'" . mysql_real_escape_string($params[ltrim($arg, ':')]) . "'", $safeSql);
        }
    }

    return $safeSql;

} //prepare()

Output is:

SELECT FROM users WHERE fname = 'Robert'); DROP TABLE students;--' AND lname = 'Smith'
SELECT FROM users WHERE fname = 'Robert\'); DROP TABLE students;--' AND lname = 'Smith'

EDIT: forgot the xkcd link http://xkcd.com/327/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文