MySQL查询中有多个PHP变量

时间:2013-10-08 11:34:45

标签: php mysql sql database pdo

我正在尝试编辑我收到的一些从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”变量被正确地插入到查询中。

我该如何以正确的方式做到这一点?

谢谢!

5 个答案:

答案 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

因此,您尝试获取klass0的所有行。我认为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();