1

mysqlデータベースからデータをフェッチする、受け取ったPHPコードを編集しようとしています。これは、基本的にデータを取得し、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数値なの?PDO::PARAM_STRそうでない場合は、代わりに試してキャストPDO::PARAM_INTを削除してください。(int)

すでに準備済みステートメントを使用しているため、そのまま使用し、PHP 変数を直接追加しないでください。SQL インジェクション用のスクリプトを再度開いています。

于 2013-10-08T11:45:09.087 に答える
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

悪いこと$klassに、 is set の場合にのみ設定します$_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ます0klassがゼロのテーブルにはレコードがないと思います。その結果、空の結果を受け取りました。

この方法でコードを書き直します。

$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 に答える