3

以下に示すように、単純な7 行のスクリプトがあります。 PHP

コード

require( "connect.php" );
$ctg = ($_GET['ctg'])? $_GET['ctg']:'movie';
$offset = ($_GET['off'])? $_GET['off']:30;
$query = "SELECT `msg`, `id`, `nick`, `date` FROM `entries` WHERE `ctg` = ? ORDER BY `id` DESC LIMIT 15 OFFSET ?";
$statemnt = $conn->prepare( $query );
$statemnt->bindParam( 1, $ctg, PDO::PARAM_STR );
$statemnt->bindParam( 2, $offset, PDO::PARAM_INT );
$statemnt->execute();
$results = $statemnt->fetchAll( PDO::FETCH_ASSOC );
echo "$ctg\n$offset\n" . count($results) . "\n";

問題

私が直面している問題は次のようなものです:コンソールでファイルを実行すると(を使用してphp fetch.php)、すべてechoうまくいきます。変数なしでブラウザーでページを開くと$_GET、同じ出力が観察されます。

ctgブラウザの出力は、インデックス付き変数( など)だけを指定した場合と同じhttp://localhost/fetch.php?ctg=docuです。出力は正しいです。このような:

docu
30
15

しかし、offインデックス変数を渡すと ( OR ORとして); 出力は常に次のようになります。fetch.php?off=15 fetch.php?ctg=docu&off=15 fetch.php?off=15&ctg=docu

docu
15
0

質問

出力 (およびvar_dump) は両方とも正しい値が両方の変数に渡されていることを示していますが、なぜ PDO ステートメントは結果を受け取っていないのでしょうか? count($results)残りが0になるのはなぜですか?

どんな助けでも大歓迎です。


PS

また、次のステートメントを含めました。

$statemnt->debugDumpParams();

これはブラウザ(およびコンソール)にこれをダンプします:

SQL: [102] SELECT `msg`, `id`, `nick`, `date` FROM `entries` WHERE `ctg` = ? ORDER BY `id` DESC LIMIT 15 OFFSET ?
Params:  2
Key: Position #0:
paramno=0
name=[0] ""
is_param=1
param_type=2
Key: Position #1:
paramno=1
name=[0] ""
is_param=1
param_type=1
4

1 に答える 1

1

おそらく、$off GET変数は文字列として扱われていますがint

変化する:

$offset = ($_GET['off'])? $_GET['off']:30; 

$offset = ($_GET['off'])?(intval($_GET['off']):30; 

もちろん、すべてのGET変数に対して適切な検証が存在する必要があります

于 2012-10-11T18:35:43.403 に答える