我已经尝试了以下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";
正确的方法是什么?
感谢
答案 0 :(得分:1)
正确的方法?假设$link
是mysqli_connect
$wkd = mysqli_real_escape_string($link, $_GET['wkd']);
$sql = "UPDATE filename SET weekday = '" . $wkd . "' WHERE id = 2";
答案 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
的最好防御