我是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;
这个问题已经解决了。
答案 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月学期