如何在MySQL插入语句中包含一个PHPvariables
我试图在内容表中插入值。 它工作正常,如果我没有在VALUES内的PHPvariables。 当我把variables$type
VALUES内,那么这是行不通的。 我究竟做错了什么?
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES($type, 'john', 'whatever')");
将string添加到查询中的规则很简单:
- 该string应该用引号括起来。
- 因此,这些引号应该在数据中以及其他一些字符中使用
mysql_real_escape_string()
所以,你的代码变成了
$type = 'testing'; $type = mysql_real_escape_string($type); $reporter = "John O'Hara"; $reporter = mysql_real_escape_string($reporter); $query = "INSERT INTO contents (type, reporter, description) VALUES('$type', '$reporter', 'whatever')"; mysql_query($query) or trigger_error(mysql_error()." in ".$query); // note that when running mysql_query you have to always check for errors
但是,如果要在查询的另一部分添加variables,则规则会更改。
- 要添加一个数字,您必须明确地将其转换为其types。
例如:
$limit = intval($_GET['limit']); //casting to int type! $query = "SELECT * FROM table LIMIT $limit";
- 要添加一个标识符,最好从某种白名单中select它,由硬编码的值组成
例如:
if ($_GET['sortorder'] == 'name') { $sortorder = 'name'; } else { $sortorder = 'id'; } $query = "SELECT * FROM table ORDER BY $sortorder";
为了使得所有的操作简单化并保证安全,必须使用某种占位符系统 ,其中variables不是直接进入查询,而是通过代理(称为占位符)进入查询。
所以,你的查询调用是这样的:
$type = 'testing'; $reporter = "John O'Hara"; pquery("INSERT INTO contents (type, reporter, description) VALUES(?s, ?s, ?s)", $type, $reporter,'whatever');
而且绝对不用担心所有这些事情。
对于有限的占位符组,您可以使用PDO 。 虽然对于现实生活中的使用,您将需要扩展集合,但只提供一些库,其中之一是SafeMysql 。
只要它是一个string – 你必须把它放在引号内
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
而且,是的,就像Dani所说的那样:你应该用mysql_real_escape_string()
来清理你在查询中input的每一个string
尝试这个:
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
你需要把'$type'
不只是$ type
$ type中的文本被直接replace成插入string,所以MySQL得到这个:
... VALUES(testing, 'john', 'whatever')
注意testing周围没有引号,你需要把它们放在这里:
$type = 'testing'; mysql_query("INSERT INTO contents (type, reporter, description) VALUES('$type', 'john', 'whatever')");
我也build议你阅读SQL注入 ,因为这种parameter passing很容易被黑客攻击,如果你不清理正在使用的数据:
- MySQL – 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'] . "'";
如果variables包含用户input或其他您不能信任的数据,请务必转义数据。 喜欢这个:
$query = sprintf("INSERT INTO contents (type) VALUES ('%s')", mysql_real_escape_string($type)); $result = mysql_query($query);
这里
$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
我知道这个问题有几个答案,但我想我会补充说,如果你按照下面的语法,我再也没有问题的错误。 毫无疑问你正在使用哪个表格以及你正在追加的列。
$query = "INSERT INTO contents (type, reporter, description) VALUES('".$type."', '".$reporter."', '"$whatever."')";
避免SQL注入插入语句与
$type = 'testing'; $stmt = $con->prepare("INSERT INTO contents (type, reporter, description) VALUES (?, ?, ?)"); $stmt->bind_param("sss", $type , 'john', 'whatever'); $stmt->execute(); $stmt->close();
最好的select是准备报表。 乱七八糟的报价和逃跑是比较困难的工作,难以维持。 迟早你会不小心忘记引用一些东西,或者最终逃避同一个string两次,或者搞砸了这样的事情。 在find这些types的错误之前,可能还有好几年的时间。