2011-08-19 20 views
1

什么是正确编写以下

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

$row['item']回声正确的做法,但似乎并没有在MySQL查询工作。一直有这个问题几天。我试过.$row['item'].和其他一些变化,但我必须做错了什么。

+0

显示更多的代码 –

+0

“SELECT * FROM表WHERE值= {$行[ '项目']}” 工作? – sdfadfaasd

+2

我可以*请*使用占位符获得答案?我真的很想*用字符串插值(*有或没有*'mysql_real_escape_string')向下投票*所有回复。这是2011年。请使用现代接受(无处不在*,但似乎PHP)构造 – 2011-08-19 20:51:29

回答

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'])."'"; 
+0

请首先显示准备好的语句的示例,其次是向后的方法。 – 2011-08-19 20:52:53

+0

@pst:我希望现在更有用;) – GWW

+0

@GWW:我每次看到第二种方法都会感到畏惧,因为它很容易受到SQL注入的影响。唯一的方法是使用'?'占位符和绑定参数。有了11K代表,你应该知道不推荐第二种选择。 –

-2

你缺少单引号

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

PHP例如

+0

如果其他方法不起作用,这一个并不好。它正确地取消引用数组元素,但不考虑元素内的任何可能的引号。 –

+0

是的,但问题是关于一个格式不正确的SQL查询,答案是缺少单引号......所以为了让你这样做对你如何:$ item = mysql_real_escape_string($ row ['item']); SELECT * FROM table WHERE value ='{$ item}' – Nick

0

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

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

我不知道。我建议使用占位符。一个例子 - *或至少提到* - 这样会很好。 – 2011-08-19 20:53:30

+0

根据应用程序和使用的连接,占位符方法可能不合适。虽然我同意,但使用预先准备好的陈述会更好,我不认为这回答了手头的问题 - 它只是显示了执行陈述的替代方法(albiet better)。 –

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

-1甚至不使用“escape_string”(尽管占位符/准备好的语句应该是首选) – 2011-08-19 20:54:22

+0

再次 - 这并不能解决问题,因为我看到它 - 它只是以不同的方式重述问题。 –

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 
} 
+0

显然我需要将我的php知识点一下。 – sundanlotion

+1

@ user895425不要觉得太糟糕了。 SQL注入是PHP开发人员中的一个流行病。但是,现在你已经知道准备好的陈述了,你再也没有理由再犯这个错误了。 ;)如果此答案解决了您的问题,请记住将其标记为已接受。 – AgentConundrum

+0

+1这正是我希望从这个问题中得到的答案^^ – 2011-08-19 21:44:04