8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

如何在 MySQL 语句中包含 PHP 变量

tector 1月前

59 0

我正在尝试在内容表中插入值。如果 VALUES 中没有 PHP 变量,则它可以正常工作。当我将变量 $type 放入 VALUES 中时,这不起作用。我在做什么...

我正在尝试在内容表中插入值。如果 VALUES 中没有 PHP 变量,则它可以正常工作。当我将变量放入 $type 其中 VALUES 时,它不起作用。我做错了什么?

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) 
     VALUES($type, 'john', 'whatever')");
帖子版权声明 1、本帖标题:如何在 MySQL 语句中包含 PHP 变量
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由tector在本站《codeigniter》版块原创发布, 转载请注明出处!
最新回复 (0)
  • @YourCommonSense——我完全可以预见它是否会上线或被其他人使用。

  • @Frank 这是一种非常短视的态度。正确的方法不仅可以保护您免受注入,还可以保护您免受错误。更不用说没有代码或环境是静止的。它会随着时间而发展,您无法预见它是否会上线或被其他人使用。此外,通过您的点赞,您认可了这个答案,让其他可能在不那么安全的环境中使用它的人更容易看到它。

  • 第一个代码对我来说非常完美。我不需要针对 SQL 注入的保护,因为我只在本地环境中使用它。谢谢。

  • 而且,它给出了一个错误。语法错误。应该是这样的:\' . $variable . \'

  • ....但这也是最危险的答案。你甚至没有尝试以任何方式避免 SQL 注入,并且永远不应该使用这样的代码

  • 这是简单的答案:

    $query="SELECT * FROM CountryInfo WHERE Name = '".$name."'";
    

    你可以定义 $name 任何你想要的。

    另一种更复杂的方法是这样的:

    $query = " SELECT '" . $GLOBALS['Name'] . "' .* " .
             " FROM CountryInfo " .
             " INNER JOIN District " .
             " ON District.CountryInfoId = CountryInfo.CountryInfoId " .
             " INNER JOIN City " .
             " ON City.DistrictId = District.DistrictId " .
             " INNER JOIN '" . $GLOBALS['Name'] . "' " .
             " ON '" . $GLOBALS['Name'] . "'.CityId = City.CityId " .
             " WHERE CountryInfo.Name = '" . $GLOBALS['CountryName'] .
             "'";
    
  • $type 内的文本直接替换到插入字符串中,因此 MySQL 得到以下内容:

    ... VALUES(testing, 'john', 'whatever')
    

    请注意,测试周围没有引号,您需要像这样输入它们:

    $type = 'testing';
    mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
    

    我还建议您阅读有关 SQL 注入的知识 ,因为如果您不对所使用的数据进行清理,这种参数传递很容易受到黑客攻击:

    • MySQL - SQL 注入预防
  • ycr 1月前 0 只看Ta
    引用 9

    最好的选择是准备好的语句。 处理引号和转义符一开始就比较麻烦,而且很难维护。迟早你会不小心忘记引用某些内容,或者最终两次转义同一个字符串,或者搞砸类似的事情。可能要过几年你才能发现这些类型的错误。

    http://php.net/manual/en/pdo.prepared-statements.php

  • 如果我尝试显示一个配置文件,并且在我的 $stmt 中我有 'SELECT * FROM Profile WHERE profile_id LIKE (?)'...我只有一个参数需要插入到我的 SQL 中,我该怎么做?

  • 为了避免 SQL 注入,插入语句应

    $type = 'testing';
    $name = 'john';
    $description = 'whatever';
    
    $con = new mysqli($user, $pass, $db);
    $stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
    $stmt->bind_param("sss", $type , $name, $description);
    $stmt->execute();
    
  • 在任何 MySQL 语句中添加 PHP 变量的规则非常简单:

    1. 使用准备好的语句

    此规则涵盖了 99% 的查询,尤其是您的查询。任何表示 SQL 数据文字 (或者,简单地说 - SQL 字符串或数字)都必须通过准备好的语句添加。 没有例外 。常量值可以按原样放置。

    该方法涉及四个基本步骤

    • 在 SQL 语句中,将所有变量替换为 占位符
    • 准备 结果查询
    • 变量 绑定
    • 执行 查询

    使用所有流行的 PHP 数据库驱动程序执行此操作的方法如下:

    使用添加数据文字 mysqli

    从 PHP 8.2 开始,您可以在一次调用中完成整个准备/绑定/执行序列:

    $type = 'testing';
    $reporter = "John O'Hara";
    $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)";
    $mysqli->execute_query($sql, [$reporter, $description]);
    

    如果你的 PHP 版本较旧,则必须明确完成准备/绑定/执行:

    $type = 'testing';
    $reporter = "John O'Hara";
    $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)";
    $stmt = $mysqli->prepare($sql);
    $stmt->bind_param("ss", $reporter, $description);
    $stmt->execute();
    

    代码有点复杂,但所有这些运算符的详细解释可以在我的文章“ 如何使用 Mysqli 运行 INSERT 查询” ,以及大大简化该过程的解决方案。

    对于 SELECT 查询,您可以使用与上述相同的方法:

    $reporter = "John O'Hara";
    $result = $mysqli->execute_query("SELECT * FROM users WHERE name=?", [$reporter]);
    $row = $result->fetch_assoc(); // or while (...)
    

    但是,如果你的 PHP 版本较旧,你将需要经过准备/绑定/执行例程并添加对 get_result() 方法的调用,以便获得熟悉的 mysqli_result 方法,你可以以通常的方式从中获取数据:

    $reporter = "John O'Hara";
    $stmt = $mysqli->prepare("SELECT * FROM users WHERE name=?");
    $stmt->bind_param("s", $reporter);
    $stmt->execute();
    $result = $stmt->get_result();
    $row = $result->fetch_assoc(); // or while (...)
    
    使用 PDO 添加数据文字
    $type = 'testing';
    $reporter = "John O'Hara";
    $sql = "INSERT INTO contents (type,reporter,description) VALUES ('whatever',?,?)";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$reporter, $description]);
    

    在 PDO 中,我们可以将绑定和执行部分合并在一起,这非常方便。PDO 还支持命名占位符,有些人认为这非常方便。

    2.使用白名单过滤

    任何其他查询部分(例如 SQL 关键字、表或字段名称或运算符)都必须通过 白名单 .

    有时我们必须添加一个代表查询另一部分的变量,例如关键字或标识符(数据库、表或字段名称)。这种情况很少见,但最好做好准备。

    脚本中 明确 值列表检查变量 《根据用户的选择在 ORDER BY 子句中添加字段名称》中 :

    不幸的是,PDO 没有标识符(表和字段名称)的占位符,因此开发人员必须手动过滤掉它们。这种过滤器通常称为“白名单”(我们只列出允许的值),而不是“黑名单”(我们列出不允许的值)。

    因此,我们必须明确列出 PHP 代码中所有可能的变体,然后从中进行选择。

    以下是一个例子:

    $orderby = $_GET['orderby'] ?: "name"; // set the default value
    $allowed = ["name","price","qty"]; // the white list of allowed field names
    $key = array_search($orderby, $allowed, true); // see if we have such a name
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid field name"); 
    }
    

    对于方向,应该使用完全相同的方法,

    $direction = $_GET['direction'] ?: "ASC";
    $allowed = ["ASC","DESC"];
    $key = array_search($direction, $allowed, true);
    if ($key === false) { 
        throw new InvalidArgumentException("Invalid ORDER BY direction"); 
    }
    

    经过这样的代码后, $direction $orderby 变量都可以安全地放入 SQL 查询中,因为它们要么等于允许的变体之一,要么会抛出错误。

    关于标识符最后要说的是,它们也必须根据特定的数据库语法进行格式化。对于 MySQL,它应该是 backtick 标识符周围的字符。因此,我们的 order by 示例的最终查询字符串将是

    $query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
    
返回
作者最近主题: