我正在尝试编辑我收到的一些从mysql数据库中获取数据的PHP代码,它本质上是获取数据并将其格式化为json对象。该查询使用名为“start”的php变量。我无法工作的是让它考虑另一个名为klass
的mysql查询中的php文件中的变量,当我添加它时它只返回一个空的json数组,表明查询有问题传递到数据库。
以下是原始代码:
<?php
include_once 'db.php';
//getting the varibles into PHP
$start = 0;
if(isset($_GET['start'])) {
$start = $_GET['start'];
}
if(isset($_GET['klass'])) {
$klass= $_GET['klass'];
}
//sql statement
$sql = "SELECT * FROM `table` WHERE `column2` > 0 ORDER BY `column1` ASC LIMIT :start ,30";
$stmt = $pdb->prepare($sql);
$stmt->bindValue(':start', (int) $start, PDO::PARAM_INT);
$stmt->execute();
//putting data into array
$data = array();
while($row = $stmt->fetch()) {
$data[] = array(
'id' => $row['id'],
'column1' => $row['column1'],
'column2' => $row['column2'],
'column3' => $row['column3'],
'column4' => $row['column4'],
'column5' => $row['column5']
);
$start++;
}
//send back data in json format
echo json_encode(array('nextAmt' => $start, 'laxor' => $data));
?>
这非常好用,效果很好,并将正确的数据发送回javascript jquery.post函数。
但我试图像这样在查询中添加PHP变量:
//sql statement
$sql = "SELECT * FROM `table` WHERE `column2` > 0 AND `klass` = " . $klass . "ORDER BY `column1` ASC LIMIT :start ,30";
并使用其他类似的binValue
//sql statement
$sql = "SELECT * FROM `table` WHERE `column2` > 0 AND `klass` = :klass ORDER BY `column1` ASC LIMIT :start ,30";
$stmt = $pdb->prepare($sql);
$stmt->bindValue(':start', (int) $start, PDO::PARAM_INT);
$stmt->bindValue(':klass', (str) $klass, PDO::PARAM_INT);
$stmt->execute();
并且它们似乎都没有工作,我不认为“klass”变量被正确地插入到查询中。
我该如何以正确的方式做到这一点?
谢谢!
答案 0 :(得分:0)
好的,在$ klass变量之后你错过了一个空格,我在这里为你修好了
//sql statement
$sql = "SELECT * FROM `table` WHERE `column2` > 0 AND `klass` = {$klass} ORDER BY `column1` ASC LIMIT {$start} ,30";
答案 1 :(得分:0)
字符串需要像
一样引用`klass` = " . $klass . "
你应该使用
`klass` = '" . $klass . "'
您需要添加引号的所有字符串。
答案 2 :(得分:0)
`klass` = " . $klass . "ORDER BY `column1`
^ You have missed a whitespace after end of double quote
用这个替换你的查询
$sql = "SELECT * FROM `table`
WHERE `column2` > 0 AND `klass` = " . $klass . "
ORDER BY `column1` ASC LIMIT :start ,30";
答案 3 :(得分:0)
你的最后一条路是正确的。 $klass
实际上是一个数值吗?如果没有,请尝试PDO::PARAM_STR
而不是PDO::PARAM_INT
并删除(int)
广告。
您已经在使用预准备语句,因此请坚持使用不要直接添加PHP变量。您正在再次打开SQL注入脚本。
答案 4 :(得分:0)
不好的是,您只有在设置$klass
时才设置$_GET['klass']
,但无论是否定义,都可以在任何情况下使用它。
我确定您的结果查询类似于:
SELECT *
FROM `table`
WHERE
`column2` > 0 AND
`klass` = 0
ORDER BY `column1` ASC
LIMIT 0 ,30
这是php中的小技巧:(int)
未定义变量返回0
(你在bindValue
- (int) $klass
中完成了这个技巧。例如:
$a = (int)$b;
echo $a;
//Outputs 0, even if $b was not defined. No errors/warnings
因此,您尝试获取klass
为0
的所有行。我认为klass
为零的表中没有记录。结果,您收到了空的结果。
我会以这种方式重写你的代码:
$klass_piece = isset($klass) ? ' AND `klass` = :klass' : '';
$sql = "SELECT * FROM `table` WHERE `column2` > 0" . $klass_piece . " ORDER BY `column1` ASC LIMIT :start ,30";
$stmt = $pdb->prepare($sql);
$stmt->bindValue(':start', (int) $start, PDO::PARAM_INT);
if (isset($klass)) {
$stmt->bindValue(':klass', (int) $klass, PDO::PARAM_INT);
}
$stmt->execute();