什么是正确编写以下
SELECT * FROM table WHERE value = $row['item']
$row['item']
回声正确的做法,但似乎并没有在MySQL查询工作。一直有这个问题几天。我试过.$row['item'].
和其他一些变化,但我必须做错了什么。
什么是正确编写以下
SELECT * FROM table WHERE value = $row['item']
$row['item']
回声正确的做法,但似乎并没有在MySQL查询工作。一直有这个问题几天。我试过.$row['item'].
和其他一些变化,但我必须做错了什么。
更好更合适的方法是使用库MySQLi和预准备的语句,即:
$stmt = $mysqli->prepare("SELECT * FROM table WHERE value =?");
$stmt->bind_param("s",$row['item']); // I am assuming row['item'] is a string
$stmt->execute();
如果您不能使用的mysqli或绝对拒绝你可以使用这个:
$query = "SELECT * FROM table WHERE value = '".mysql_real_escape_string($row['item'])."'";
请首先显示准备好的语句的示例,其次是向后的方法。 – 2011-08-19 20:52:53
@pst:我希望现在更有用;) – GWW
@GWW:我每次看到第二种方法都会感到畏惧,因为它很容易受到SQL注入的影响。唯一的方法是使用'?'占位符和绑定参数。有了11K代表,你应该知道不推荐第二种选择。 –
你缺少单引号
SELECT * FROM table WHERE value = '{$row['item']}'
PHP例如
如果其他方法不起作用,这一个并不好。它正确地取消引用数组元素,但不考虑元素内的任何可能的引号。 –
是的,但问题是关于一个格式不正确的SQL查询,答案是缺少单引号......所以为了让你这样做对你如何:$ item = mysql_real_escape_string($ row ['item']); SELECT * FROM table WHERE value ='{$ item}' – Nick
我通常建议这样做的方式是这样的:
$sql = sprintf("SELECT * FROM table WHERE value = '%s'",
mysql_real_escape_string($row['item']));
我不知道。我建议使用占位符。一个例子 - *或至少提到* - 这样会很好。 – 2011-08-19 20:53:30
根据应用程序和使用的连接,占位符方法可能不合适。虽然我同意,但使用预先准备好的陈述会更好,我不认为这回答了手头的问题 - 它只是显示了执行陈述的替代方法(albiet better)。 –
$item = mysql_real_escape_string($row['item']);
$mysqlQuery = "SELECT * FROM table WHERE value = '" . $item . "'";
-1甚至不使用“escape_string”(尽管占位符/准备好的语句应该是首选) – 2011-08-19 20:54:22
再次 - 这并不能解决问题,因为我看到它 - 它只是以不同的方式重述问题。 –
答案排序取决于什么是$row['item']
变量中举行。如果它是一个数值,那么上面的查询应该没问题。由于它不起作用,我假定该变量的值实际上是一个字符串。在这种情况下,您需要用引号包围该值,以便数据库可以将其正确地标识为字符串值(否则,这只是数据库无法识别的乱码“命令”,导致查询失败)。
无论如何,在几乎任何情况下都不应直接将变量插入查询。原因是,如果你不是非常小心,它会打开你的SQL注入。例如,如果您的$row['item']
变量被包装在查询中的单引号中,但包含其单引号的值,那么数据库会将该变量中的引号解释为整个参数的结尾引号,查询。更糟的是,黑客可以利用这一点完全结束你的查询,然后添加他自己创建的第二个查询(或者他们可以在原始结尾引入UNION查询等)。最起码,你应该运行在可变像mysql_real_escape_string()
使用它之前:
$sql = "SELECT * FROM table WHERE value = " .
mysql_real_escape_string($row['item']);
来解决这个问题,并保护您的查询的最佳方法是使用准备好的语句。这些查询在其中包含占位符而不是连接变量。您使用这些占位符准备查询,然后向数据库发出其他命令以告诉它在这些占位符中放置了什么值。然后数据库负责处理这些变量的棘手问题,以免造成任何损害。您可以使用此PDO:
try {
$dbh = new PDO(DB_DSN,
DB_USER,
DB_PASS,
array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)
);
} catch (PDOException $e) {
echo "Connection failed: " . $e->getMessage();
exit();
}
// create query with a named placeholder
$sql = "SELECT * FROM table WHERE value = :value";
try {
$stmt = $dbh->prepare($sql);
// tell PDO to substitute the value in $row['item']
// for the named parameter specified above.
$stmt->bindValue(":value", $row['item']);
// execute the query and load the results into an array
$stmt->execute();
$records = $stmt->fetchAll();
} catch (PDOException $e) {
echo "Query failed: " . $e->getMessage();
exit();
}
foreach ($records as $record) {
// use db records
}
显然我需要将我的php知识点一下。 – sundanlotion
@ user895425不要觉得太糟糕了。 SQL注入是PHP开发人员中的一个流行病。但是,现在你已经知道准备好的陈述了,你再也没有理由再犯这个错误了。 ;)如果此答案解决了您的问题,请记住将其标记为已接受。 – AgentConundrum
+1这正是我希望从这个问题中得到的答案^^ – 2011-08-19 21:44:04
显示更多的代码 –
“SELECT * FROM表WHERE值= {$行[ '项目']}” 工作? – sdfadfaasd
我可以*请*使用占位符获得答案?我真的很想*用字符串插值(*有或没有*'mysql_real_escape_string')向下投票*所有回复。这是2011年。请使用现代接受(无处不在*,但似乎PHP)构造 – 2011-08-19 20:51:29