MySQL - 构建查询字符串

时间:2015-04-15 03:05:56

标签: php mysql

我已经尝试了以下LL但我似乎无法让它正常工作

$sql="UPDATE filename SET weekday = {$_GET[wkd]} WHERE id = 2";    
$sql="UPDATE filename SET weekday = '$_GET[wkd]' WHERE id = 2";    
$sql="UPDATE filename SET weekday = '"{$_GET[wkd]}"' WHERE id = 2";    
$sql="UPDATE filename SET weekday = '."{$_GET[wkd]}".' WHERE id = 2";

正确的方法是什么?
感谢

3 个答案:

答案 0 :(得分:1)

正确的方法?假设$linkmysqli_connect

$wkd = mysqli_real_escape_string($link, $_GET['wkd']);

$sql = "UPDATE filename SET weekday = '" . $wkd . "' WHERE id = 2";

http://de1.php.net/manual/en/mysqli.real-escape-string.php

答案 1 :(得分:0)

此:

$sql="UPDATE filename SET weekday = '" . $_GET['wkd'] . "' WHERE id = 2";

仅供参考,这是非常糟糕的编码习惯,你应该在添加到sql之前验证$ _GET。

答案 2 :(得分:0)

好的。如果工作日接受字符串值,那么该值需要用引号括起来,即:

$sql="UPDATE filename SET weekday = '" . $_GET['wkd'] . "' WHERE id = 2";

这也相当于:

$sql="UPDATE filename SET weekday = '{$_GET['wkd']}' WHERE id = 2";

第一个将字符串连接在一起,第二个只是将变量直接插入字符串。

对于$_GET['wkd'] = "tuesday";,这些查询的机器人输出:

UPDATE filename SET weekday = 'tuesday' WHERE id = 2

如果工作日只接受数值,那么就不需要用引号包围该值(但你仍然可以):

$sql="UPDATE filename SET weekday = " . $_GET['wkd'] . " WHERE id = 2";

与第一个相似,相当于:

$sql="UPDATE filename SET weekday = {$_GET['wkd']} WHERE id = 2";

对于$_GET['wkd'] = 1,将同时输出两个查询:

UPDATE filename SET weekday = 1 WHERE id = 2

重点是 - 没有一个正确的语法,它们都可以工作。

但是,你真正想做的是使用pdo或mysqli和预先准备好的语句和参数绑定,如下所示:

$pdo = new PDO('... connection string ... ');
$stmt = $pdo->prepare("UPDATE filename SET weekday = ? WHERE id = ?"); 
$stmt->execute(array($_GET['wkd'], 2));

这会将$_GET['wkd']的值绑定到预准备语句中的第一个?,将文本2绑定到第二个`?'的值。如果您发现自己使用了大量问号或丢失了订单,您还可以使用这样的命名占位符:

$pdo = new PDO('... connection string ... ');
$stmt = $pdo->prepare("UPDATE filename SET weekday = :weekday WHERE id = :id"); 
$stmt->execute(array(
  'weekday' => $_GET['wkd'],
  'id' => 2
));

在该示例中,我将占位符命名为与字段相同 - 这不是必需的,但显然比命名占位符:asdfasdf:lmnop更具可读性(在这种情况下,数组被传递给execute函数的将是('asdfasdf' => $_GET['wkd'], 'id' => 2)

为什么要使用参数绑定?它是对SQL Injection

的最好防御