如何在MySQL插入语句中包含一个PHPvariables

我试图在内容表中插入值。 它工作正常,如果我没有在VALUES内的PHPvariables。 当我把variables$type VALUES内,那么这是行不通的。 我究竟做错了什么?

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

将string添加到查询中的规则很简单:

  1. 该string应该用引号括起来。
  2. 因此,这些引号应该在数据中以及其他一些字符中使用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的错误之前,可能还有好几年的时间。

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