mysql SELECT * WHERE value = $ row ['item']

时间:2011-08-19 20:45:52

标签: php mysql

编码以下内容的正确方法是什么

SELECT * FROM table WHERE value = $row['item']

$row['item']回声正确,但似乎不适用于mysql查询。几天来一直有这个问题。我尝试了.$row['item'].和其他一些变化,但我一定做错了。

5 个答案:

答案 0 :(得分:1)

更合适的方法是使用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'])."'"; 

答案 1 :(得分:1)

答案类型取决于$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
}

答案 2 :(得分:0)

我通常建议这样做的方式是这样的:

$sql = sprintf("SELECT * FROM table WHERE value = '%s'",
    mysql_real_escape_string($row['item']));

答案 3 :(得分:0)

$item = mysql_real_escape_string($row['item']);
$mysqlQuery = "SELECT * FROM table WHERE value = '" . $item . "'";

答案 4 :(得分:-2)

你缺少单引号

SELECT * FROM table WHERE value = '{$row['item']}'

PHP示例