【发布时间】:2011-02-08 08:32:08
【问题描述】:
我只想将变量“$read”定义为它在数据库中的任何值。我该怎么做?
$read = "SELECT `read` FROM `users` WHERE `id` = '$id'";
【问题讨论】:
我只想将变量“$read”定义为它在数据库中的任何值。我该怎么做?
$read = "SELECT `read` FROM `users` WHERE `id` = '$id'";
【问题讨论】:
$read = mysql_result(mysql_query("SELECT read FROM users WHERE id = $id"),0);
【讨论】:
$id 是安全的,但请明确地这样做。或者更好的是,不要。
$id 是用户输入,但是您认为可以安全地假设执行简单 SQL 查询有困难的人在没有明确说明的情况下正确清理了他们的输入吗?
注意使用mysql_query 给出的答案,因为它们容易受到SQL injection 的攻击。
如果$id 由用户提供,则切勿将其直接放入 SQL 查询中,而应使用预准备语句。
这样做的一种方法是使用PDO,方式类似于:
$dbh = new PDO($connStr, $user, $pass);
$sql = "SELECT `read` FROM `users` WHERE `id` = :id";
$statement = $dbh->prepare($sql);
$statement->execute( array('id' => $id) );
$read = $statement->fetchColumn();
有关如何使用 PDO 的更多信息,请参阅以下内容:
【讨论】:
mysqli,它比旧的mysql 函数更受欢迎。
mysql 函数,您必须手动确保所有输入都经过适当的清理。通过使用准备好的查询,您不必担心对输入进行清理,这通常会使您的脚本安全,假设您正确使用它们。
实现此目的的一种方法如下:
// Run the query
$db_result = mysql_query("SELECT read FROM users WHERE id = $id");
// Get the first row (in this case you'll only get one row)
$row = mysql_fetch_array($db_result, MYSQL_NUM);
// Get the first column (you should only have one column anyway) and put it into your variable
$read = $row[0];
如下所述,我应该补充一点,如果您不相信 $id 会被正确转义,您可能会受到SQL injection 的攻击。为了克服这个问题,您应该确保正确地转义并验证 $id 或使用某种绑定或准备好的语句来为您完成此操作,例如在this question 或下面的示例中。
【讨论】:
我知道教别人一些东西几乎是不可能的,尤其是当他们不想学习的时候。但希望它对其他人有用
所有现代编程语言都支持这种称为“用户定义函数”的东西。
一个非常方便的功能。
想要让代码真正整洁的程序员可以从一些重复的代码中创建一个函数,并使调用该代码的过程变得非常小,就像在 OP 中所说的那样:
$read = dbgetvar("SELECT `read` FROM `users` WHERE `id` = %d",$id);
这种方法的另一个好处 - 您的代码可以包含所有必要的东西,例如参数清理和错误处理。而且仍然调用这个代码会比上面所有的代码都短,为了追求简短而变得丑陋和难以维护。
这种函数的一个例子
function dbgetvar(){
$args = func_get_args();
$query = array_shift($args);
$query = str_replace("%s","'%s'",$query);
foreach ($args as $key => $val) {
$args[$key] = mysql_real_escape_string($val);
}
$query = vsprintf($query, $args);
$res = mysql_query($query);
if (!$res) {
trigger_error("dbget: ".mysql_error()." in ".$query);
return FALSE;
}
$row = mysql_fetch_row($res)
if (!$row) return NULL;
return $row[0];
}
【讨论】:
我会做以下事情:
// leave the single quotes around $id because it most probably is an INT
// LIMIT 1 will make the query a bit faster
$result = mysql_query("SELECT `read` FROM `users` WHERE `id` = $id LIMIT 1");
$row = mysql_fetch_row($result);
$read = $row[0];
希望它对你有用。
【讨论】:
假设只有 1 个结果:
$read = mysql_fetch_array(mysql_query("SELECT read FROM users WHERE id = $id"));
$read = $read[0];
【讨论】: