如何在mysql语句中包含php变量

insrf1ej  于 2021-07-26  发布在  Java
关注(0)|答案(6)|浏览(419)

我正在尝试在目录表中插入值。如果我的值中没有php变量,它就可以正常工作。当我把变量 $type 内部 VALUES 那就不行了。我做错什么了?

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

drnojrws1#

在任何mysql语句中添加php变量的规则都很简单:
任何表示sql数据文本的变量(或者简单地说,一个sql字符串或一个数字)都必须通过准备好的语句添加。没有例外。
任何其他查询部分(如sql关键字、表或字段名或运算符)都必须通过白名单进行筛选。
因此,由于您的示例只涉及数据文本,因此必须通过占位符(也称为参数)添加所有变量。为此:
在sql语句中,用占位符替换所有变量
准备结果查询
将变量绑定到占位符
执行查询
下面介绍如何使用所有流行的php数据库驱动程序:

使用mysql ext添加数据文本

这样的司机根本不存在。

使用mysqli添加数据文本

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

代码有点复杂,但是关于所有这些操作符的详细解释可以在我的文章中找到,如何使用mysqli运行insert查询,以及一个大大简化这个过程的解决方案。
对于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添加数据文本

$type = 'testing';
$reporter = "John O'Hara";
$query = "INSERT INTO contents (type, reporter, description) 
             VALUES(?, ?, 'whatever')";
$stmt = $pdo->prepare($query);
$stmt->execute([$type, $reporter]);

在pdo中,我们可以将绑定和执行部分结合起来,这非常方便。pdo还支持一些非常方便的命名占位符。

添加关键字或标识符

有时我们必须添加一个表示查询另一部分的变量,例如关键字或标识符(数据库、表或字段名)。这是个罕见的病例,但最好做好准备。
在这种情况下,必须对照脚本中显式编写的值列表检查变量。我的另一篇文章对此进行了解释,根据用户的选择在ORDERBY子句中添加了一个字段名:
不幸的是,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的最终查询字符串是

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

s1ag04yj2#

为避免sql注入,请使用be插入语句

$type = 'testing';
$name = 'john';
$description = 'whatever';

$stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)");
$stmt->bind_param("sss", $type , $name, $description);
$stmt->execute();
idv4meu8

idv4meu83#

最好的选择是准备好的陈述。在引用和转义词上乱搞是一件很难开始的工作,也很难维持。迟早你会意外地忘记引用某个词,或者两次跳出同一个字符串,或者搞砸类似的事情。可能要过几年你才能找到那种虫子。
http://php.net/manual/en/pdo.prepared-statements.php

pwuypxnk

pwuypxnk4#

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

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

请注意,测试中没有引号,您需要这样写:

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

我还建议您仔细阅读sql注入,因为如果您不清理正在使用的数据,这种参数传递很容易被黑客攻击:
mysql-sql注入预防

woobm2wo

woobm2wo5#

答案很简单:

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

gpnt7bae6#

在这里

$type='testing' //it's string

mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");//at that time u can use it(for string)

$type=12 //it's integer
mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");//at that time u can use $type

相关问题