Php 将参数传递到查询中

Php 将参数传递到查询中,php,pdo,Php,Pdo,我是php和PDO的新手。我只是想知道如何将参数传递到我的查询中, 我已经分配了$a=“2010年1月学期”并传递到我的查询。但是当我回显查询时,它显示如下 从VMESubjectGrade中选择Nama、摄入、矩阵,其中摄入=“$a”由Nama分组 它应该是这样显示的 从VMESubjectGrade中选择Nama、录取、matricNo,其中录取=“2010年1月学期”由Nama分组 这是我的密码, 希望你能给我建议, 特别感谢 $a="January 2010 Semester";

我是php和PDO的新手。我只是想知道如何将参数传递到我的查询中, 我已经分配了$a=“2010年1月学期”并传递到我的查询。但是当我回显查询时,它显示如下

从VMESubjectGrade中选择Nama、摄入、矩阵,其中摄入=“$a”由Nama分组

它应该是这样显示的 从VMESubjectGrade中选择Nama、录取、matricNo,其中录取=“2010年1月学期”由Nama分组

这是我的密码, 希望你能给我建议, 特别感谢

$a="January 2010 Semester";   

mysql_select_db("school", $con);
$query2='SELECT DISTINCT(SubCode) FROM VMESubjectGrade where Intake="$a"'  ;
$query2testing = mysql_query($query2);  

try {
    $db = new PDO('mysql:host=localhost;dbname=school;charset=utf8', 'root', 'xxx');
} catch (PDOException $e) {
    echo $e->getMessage();
}

//get the SubCodes
$stmt = $db->query('SELECT DISTINCT(SubCode) FROM VMESubjectGrade where Intake="$a"');
$row_count = $stmt->rowCount();


//generate pivot sql statement
$sql = 'SELECT Nama,Intake,matricNo, ';
$dynamic_fields = array();
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $dynamic_fields[] = $row['SubCode'];
    $sql .= "MAX(CASE SubCode when '{$row['SubCode']}' then grade end) AS {$row['SubCode']}";
    if ($row_count > 1) {
        $sql .=',';
    }
    $row_count--;
}
$sql .= ' FROM VMESubjectGrade where Intake="$a" GROUP BY Nama ';
echo $sql;
这个问题已经解决了。

我知道你认为你已经解决了这个问题,但是请看这个!! PDO的一个主要优点是能够执行此操作,这将清理数据库输入。正如您目前所拥有的,您很容易受到SQL注入的攻击

如果有人传递了您在查询中使用的变量,而您没有对其进行清理,您将陷入大麻烦。假设
$a
设置为
“DROP TABLE VMESubjectGrade;”--
。您的查询会变成什么?它会变成这样:

SELECT DISTINCT(SubCode) FROM VMESubjectGrade where Intake=""; DROP TABLE VMESubjectGrade;--"
有人尝试这样的事情的那一天对你来说将是非常糟糕的一天,除非你正确地清理数据库输入

尝试按以下方式执行查询:

$query = 'SELECT DISTINCT(SubCode) FROM VMESubjectGrade where Intake = :a';
$stmt = $db->prepare($query);
$stmt->execute(array(':a' => $a));
这将把参数传递给查询,并清理变量,以防它实际上来自用户输入


:a
充当查询中某个参数的占位符,您可以在执行时指定该参数的值。

您应该像这样将该字符串合并到查询中

echo$query2='从VMESubjectGrade中选择不同的(子代码),其中摄入='.$a'

$query2testing=mysql\u查询($query2)


输出如下->选择不同(子代码)从VMESubjectGrade,其中ADTANCE=2010年1月学期

PHP不会解释单引号字符串中的变量。将SQL字符串与其中的单引号变量双引号。您将PDO与mysql_*查询混合在一起。您需要删除所有mysql_*查询。您还应该使用占位符,否则您将无法获得最大的好处使用PDO保护您的查询。亲爱的Michael Berkowski:是的,我已经更改了单引号字符串。它现在正在工作。:)您不应该像那样将值传递到查询中,您的代码中引入了安全漏洞。请查看如何使用准备好的查询。下面是一些关于如何o准备并执行查询。