解释这3个查询之间的区别,哪个是最好的?

时间:2013-08-17 09:09:24

标签: php variables

我搜索了很多,但无法找到任何与我的问题有关的问题所以我发布了这个问题。

我开始知道以下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;

所以我很困惑。

4 个答案:

答案 0 :(得分:1)

没有不同的编写查询的方法,这些只是在PHP中编写字符串的不同方法。要清除任何混淆,您应该浏览PHP strings manual并阅读有关创建字符串的所有可能方法。该文档解释了四种可能的语法以及如何“解析”字符串中的变量。

在编写查询(安全查询)之前,您必须了解字符串在PHP中的工作方式。然后,您可以浏览these answers以找出编写查询的正确方法。

答案 1 :(得分:0)

正如人们在评论中开始指出的那样,这些方法都不可取或不安全。

问题是SQL注入,如here所述。

您想要使用PDO。请参阅this tutorialthis 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注入使用:

  1. 使用预备语句。

    例如:

    <?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); } ?> `

  2. 在php中使用PDO个对象。