我搜索了很多,但无法找到任何与我的问题有关的问题所以我发布了这个问题。
我开始知道以下3行做同样的工作。
$q="insert into employee values('".$e."','".$nm."','".$desg."','".$sal."')";
$q="insert into employee values('$e','$nm','$desg','$sal')";
$q="insert into employee values('{$e}','{$nm}','{$desg}','{$sal}')";
$e, $name, &desg, &sal are variables.
我很困惑哪一个是最好的,为什么这三个工作相同。第一个对我来说完全清楚它用值替换变量并创建查询。
但在第二和第三,我不清楚变量是如何被替换的。这是我正在学习的地方,他们说如果我将一个变量插入到一个echo中,那么它应该用{}括起来或者连接起来。
ex:echo "This is {$name}" / echo "This is ".$name;
所以我很困惑。
答案 0 :(得分:1)
没有不同的编写查询的方法,这些只是在PHP中编写字符串的不同方法。要清除任何混淆,您应该浏览PHP strings manual并阅读有关创建字符串的所有可能方法。该文档解释了四种可能的语法以及如何“解析”字符串中的变量。
在编写查询(安全查询)之前,您必须了解字符串在PHP中的工作方式。然后,您可以浏览these answers以找出编写查询的正确方法。
答案 1 :(得分:0)
正如人们在评论中开始指出的那样,这些方法都不可取或不安全。
问题是SQL注入,如here所述。
您想要使用PDO。请参阅this tutorial或this reference。
所以连接:
$dsn="mysql:host=127.0.0.1;dbname=myDatabase";
$username="myUsername";
$password="myPassword";
try {
$DBH=new PDO($dsn,$username,$password);
} catch(PDOException $e) {
echo $e->getMessage();
}
示例插入:
$STH = $DBH->prepare("INSERT INTO job (snum, date, length, type, ref) VALUES (:u,:d,:l,:t,:r)");
$STH->bindParam(':u', $myVariable1);
$STH->bindParam(':d', $myVariable2);
$STH->bindParam(':l', $myVariable3);
$STH->bindParam(':t', $myVariable4);
$STH->bindParam(':r', $myVariable5);
try {
$STH->execute();
} catch(PDOException $e) {
echo $e->getMessage();
}
答案 2 :(得分:0)
回答你的问题:
这是简单的字符串连接:
$q="insert into employee values('" . $e . "','" . $nm . "','" . $desg . "','" . $sal . "')";
这是value substitution,PHP将使用" "
的字符串文字:
$q="insert into employee values('$e','$nm','$desg','$sal')";
第三个样本不正确。仅当您想要使用数组值的#2替换时,才需要{
和}
:
$q="insert into employee values('{$e[0]}','{$nm[0]}','{$desg['somekey']}','{$sal[o]}')";
如上所述,您认真不想要使用其中任何一个来构建查询字符串。 PDO和MySQLi库都具有更安全的参数化功能。
答案 3 :(得分:0)
比较我们得到的这四个查询:
echo "My name is $name" //0.00099992752075195
echo "My name is ".$name; //0.00099992752075195
echo "My name is {$name}"; //0.0010001659393311
echo "My name is '{$name}'"; //0.0010001659393311
证明第一次查询会表现得更好。
这三个在一般用途上都很好,但最容易被sql注入使用:
使用预备语句。
例如:
<?php
$q = 'Insert INTO counter(num) values (?);
$stmt = mysqli_prepare($dbc, 'i'); // check weather only integer is passed
mysqli_stmt_bind_param($stmt, 'i', $n);
for($n=1;$n<= 100; $n++)
{
mysqli_stmt_execute($stmt);
}
?>
`
在php中使用PDO个对象。