1

我正在尝试编辑我收到的一些 PHP 代码,这些代码从 mysql 数据库中获取数据,它本质上是获取数据并将其格式化为 json 对象。该查询使用名为“start”的 php 变量。我无法开始工作的是让它考虑mysql查询中php文件中的另一个变量,klass当我添加它时它只返回一个空的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”变量没有正确插入到查询中。

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

谢谢!

4

5 回答 5

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();
于 2013-10-08T12:12:54.237 回答
0

好的,在这个你在 $klass 变量之后缺少一个空格,我在这里为你修复了它

//sql statement

$sql = "SELECT * FROM `table` WHERE `column2` > 0 AND `klass` = {$klass} ORDER BY `column1` ASC LIMIT {$start} ,30";
于 2013-10-08T11:38:36.763 回答
0

字符串需要像 for

`klass` = " . $klass . "

你应该使用

`klass` = '" . $klass . "'

对于您需要添加引号的所有字符串。

于 2013-10-08T11:39:12.830 回答
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";         
于 2013-10-08T11:39:15.643 回答
0

你的最后一种方法是正确的。$klass实际上是一个数值吗?如果没有,请尝试PDO::PARAM_STR代替PDO::PARAM_INT并删除(int)演员表。

您已经在使用准备好的语句,所以请继续使用它,不要直接添加 PHP 变量。您再次打开脚本进行 SQL 注入。

于 2013-10-08T11:45:09.087 回答