Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在MySQL语句中包含PHP变量_Php_Mysql_Sql_String_Variables - Fatal编程技术网

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

如何在MySQL语句中包含PHP变量,php,mysql,sql,string,variables,Php,Mysql,Sql,String,Variables,我正在尝试在目录中插入值。如果我的值中没有PHP变量,它就可以正常工作。当我将变量$type放入值中时,这就不起作用了。我做错了什么 $type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')"); $type中的文本被直接替换到insert字符串中,因此MySQL得到以下结果: ... VALUES(test

我正在尝试在目录中插入值。如果我的值中没有PHP变量,它就可以正常工作。当我将变量
$type
放入
值中时,这就不起作用了。我做错了什么

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

$type中的文本被直接替换到insert字符串中,因此MySQL得到以下结果:

... VALUES(testing, 'john', 'whatever')
请注意,测试周围没有引号,您需要将这些引号放在下面这样的位置:

$type = 'testing';
mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
我还建议您继续阅读,因为如果您不清理正在使用的数据,这种参数传递很容易被黑客攻击:


在任何MySQL语句中添加PHP变量的规则都很简单:

  • 任何表示SQL数据文字的变量(或者,简单地说,一个SQL字符串或一个数字)都必须通过准备好的语句添加。没有例外
  • 任何其他查询部分,如SQL关键字、表或字段名或运算符,都必须通过白名单进行筛选
  • 因此,由于您的示例只涉及数据文本,所以必须通过占位符(也称为参数)添加所有变量。为此:

    • 在SQL语句中,用占位符替换所有变量
    • 准备生成的查询
    • 将变量绑定到占位符
    • 执行查询
    下面是如何使用所有流行的PHP数据库驱动程序:

    使用mysql-ext添加数据文本 这样的司机

    使用
    mysqli
    代码有点复杂,但是在我的文章中可以找到所有这些操作符的详细解释,以及一个大大简化过程的解决方案

    对于SELECT查询,您只需添加对
    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添加数据文本 在PDO中,我们可以将绑定和执行部分结合起来,这非常方便。PDO还支持一些非常方便的命名占位符

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

    在这种情况下,必须对照脚本中明确写入的值列表检查变量。我的另一篇文章对此进行了解释:

    不幸的是,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
    $orderby
    变量都可以安全地放入SQL查询中,因为它们要么等于允许的变量之一,要么会抛出错误

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

    $query = "SELECT * FROM `table` ORDER BY `$orderby` $direction";
    

    这是一个简单的答案:

    $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'] .
             "'";
    

    为了避免SQL注入,使用be插入语句

    $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();
    

    最好的选择是事先准备好的陈述。在引用和转义中混日子是一件很难开始的工作,也很难维护。迟早你会意外地忘记引用某个词,或者两次跳出同一个字符串,或者搞糟类似的事情。可能要过几年才能找到这些类型的bug


    重要提示:如果我试图显示配置文件,那么直接将变量插入SQL是一个主要的原因,在我的$stmt中,我有“SELECT*FROM profile WHERE profile_id LIKE(?)”。。我只有一个参数要插入到我的SQL中,我该怎么做呢?
    $query="SELECT * FROM CountryInfo WHERE 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 = '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();