将参数传递给查询

时间:2014-02-12 03:36:57

标签: php pdo

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

SELECT Nama,Intake,matricNo,FROM VMESubjectGrade其中Intake =“$ a”GROUP BY Nama

它应该像这样显示 SELECT Nama,Intake,matricNo,FROM VMESubjectGrade其中Intake =“2010年1月学期”GROUP BY 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;

这个问题已经解决了。

2 个答案:

答案 0 :(得分:0)

我知道你认为你已经解决了这个问题,但请阅读这个!!

PDO的一个主要优点是能够执行parameterized queries,这将清理您的数据库输入。正如您目前所拥有的那样,您很容易受到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充当查询中参数的占位符,并在执行时指定它的值。

答案 1 :(得分:0)

你应该将这个字符串汇总成这样的查询

echo $ query2 ='SELECT DISTINCT(SubCode)FROM VMESubjectGrade其中Intake ='。$ a。'';

$ query2testing = mysql_query($ query2);

输出将是这样的 - > SELECT DISTINCT(SubCode)FROM VMESubjectGrade Intake = 2010年1月学期