スレッド表示 | フラット表示〕 全トピック 920 件中 205 番目 次≫ ≪前

配列について

created: 2006-08-09 15:35 | modified: 2006-08-11 00:19 | reply: 7

[3212] 配列について

user: matu | created: 2006-08-09 15:35
こんにちわ
いつも色々と勉強させて頂いています。
配列についての質問があります。
チェックボックスからデータを選択することはできているのですが、同時に複数選択したデータをSQL文で処理して表示させようとすると、なぜかデータが1つしか表示されません。

プログラムは下記の処理でしています

$cheockbox = $_POST["chk"];
foreach($cheockbox as $code){
var_dump($code)//ここでは選択したデータが来たか来ていないかの確認をしています。
ちなみにこの時点では複数のデータが来たことが確認できました//
$result = pg_quer($con,"select * from sample where code = $code");
}

何度も試してみましたがうまくいきません。
アドバイスを頂けないでしょうか?
よろしくお願いします。
reply: 3213 3215 3218 返信 編集 削除

[3213] RE:

user: Pluto | created: 2006-08-09 16:29
foreach($checkbox as $code) {
この部分で、$checkboxから取り出されている$codeは配列のキーです。
おそらくお目当ては、キーではなく値の方でしょうから、その場合、
$result = pg_query($con, "select * from sample where code = {$cheokbox[$code]}");
としてあげてはどうでしょう?
Parent: 3212  reply: 3214 返信 編集 削除

[3214] Re.RE:

user: matu | created: 2006-08-09 21:36
plutoさん返事ありがとうございます
遅くなってすいません
以下のように試してみましたができませんでした
>
> $result = pg_query($con, "select * from sample where code = {$cheokbox[$code]}");
>

データを3つ選択し実行してみました。
var_dump($result)
で確認して見ると
以下のメッセージが表示されます。
bool(false) bool(false) bool(false)
また色々試してみましたがダメでした。

配列をSQL文で処理する事はできないでしょうか?
Parent: 3213  返信 編集 削除

[3215] Re. 配列について

user: ゆうじ | created: 2006-08-09 22:59
こんばんわ。

・・・なぜかデータが1つしか表示されません。

"1つ表示できた" というのがとても気になります。
ループ終了後に pg_fetch_array($result) とか、していませんよね。
きっと投稿するためにまとめ過ぎたのでしょうけれど、
コードの中に問合せ結果を表示させる部分がないので、
表示部分のコードも含めた方が何かわかるかもしれません。


あと、where と code の間が全角なのは、単なる記述違いとして、
PostgreSQL を使ってないので教えて欲しいのですが、
MySQLでは、値が 予約語と重複してたりすると、おかしなことになるので、
値が数値でない限り、シングルクォートで挟みます。
この場合は挟まなくても良いのでしょうか。
これも含めSQL文のチェックもしといたほうが良いでしょうね。

なお foreach の使い方は、初めのコードのままで良いですよ。
Pluto さん、勘違いしていらっしゃいます。


以上まとめて、
こんなコードでテストしてみると何かわかるかもしれません。

$con = pg_pconnect('dbname=publisher');

$cheockbox = array(
'1111',
'2222',
'3333'
);

foreach($cheockbox as $code){

// SQL文チェック
$sql = "select * from sample where code = '$code'";
echo $sql, '<br>';

// 問合せ
$result = pg_query($con, $sql);

// 結果表示
$row = pg_fetch_array($result);
var_dump($row);
echo '<br>';
}
Parent: 3212  reply: 3217 返信 編集 削除

[3217] Re.Re. 配列について

user: matu | created: 2006-08-10 01:28
こんばんわ
ゆうじさん返事ありがとうございます。
遅くなってすいません。

> "1つ表示できた" というのがとても気になります。
> ループ終了後に pg_fetch_array($result) とか、していませんよね。

すいません。
ループ終了後に pg_fetch_array($result)をおこなっていました。

> PostgreSQL を使ってないので教えて欲しいのですが、
> MySQLでは、値が 予約語と重複してたりすると、おかしなことになるので、
> 値が数値でない限り、シングルクォートで挟みます。
> この場合は挟まなくても良いのでしょうか。
> これも含めSQL文のチェックもしといたほうが良いでしょうね。

値をシングルクォートで挟むのを忘れていました。

> 以上まとめて、
> こんなコードでテストしてみると何かわかるかもしれません。
>
>
> $con = pg_pconnect('dbname=publisher');
>
> $cheockbox = array(
> '1111',
> '2222',
> '3333'
> );
>
> foreach($cheockbox as $code){
>
> // SQL文チェック
> $sql = "select * from sample where code = '$code'";
> echo $sql, '<br>';
>
> // 問合せ
> $result = pg_query($con, $sql);
>
> // 結果表示
> $row = pg_fetch_array($result);
> var_dump($row);
> echo '<br>';
> }
> </codef

ゆうじさんが作ってくれたプログラムで試してみました。
結果は、配列で指定した3つのデータは、3つとも確認出来ました。
確認が出来たのでforeach()の中に表示用のプログラムを入れて実行してみましたが、
結果は最後の'3333'のデータだけが表示されます
やはり最初のデータは上書きされているのでしょうか?
Parent: 3215  reply: 3219 返信 編集 削除

[3219] Re.Re. 配列について

user: ゆうじ | created: 2006-08-10 22:31
> 確認が出来たのでforeach()の中に表示用のプログラムを入れて実行してみましたが、
> 結果は最後の'3333'のデータだけが表示されます
> やはり最初のデータは上書きされているのでしょうか?

現時点では、foreachループの中に原因がありそうですが、
判断材料が無いのでなんとも判断できません。
もう一回コードを挙げてみては。
Parent: 3217  返信 編集 削除

[3218] IN演算子を使っては?

user: ach | created: 2006-08-10 03:44
SQLにはこういうこともあろうかとIN(ANY)演算子という便利な演算子が存在します.

select * in hoge where bar IN (2,4,6);
これは次のSQL文と同じです
select * in hoge where bar = 2 OR bar = 4 OR bar = 6;

これを利用してコードを書くとこんな感じです
//SQLインジェクション対策
$checkbox = $_POST['chk'];
foreach ($checkbox as $val)
if (!is_numeric($val)) die("不正入力\n");

//INコマンド一発でセレクト(implode関数はマニュアルに載ってます)
$result = pg_query($con, 'select * from sample where code IN ('. implode(',', $checkbox) .')');

//結果セットをループ
while ($row = pg_fetch_row($result)) {
var_dump($row);
}

SQLインジェクション対策(サニタイズ部分)の汎用性をあげるとこんな感じ
//サニタイズ関数 PEAR::DB::pgsql の smartquoteをハック
function sanitize($in)
{
if (is_numeric($in))
return (string)$in;
if (is_string($in))
return "'" . str_replace("'", "''", str_replace('\\', '\\\\', $in)) . "'";
return FALSE;
}

//array_mapでサニタイズして,string以外があれば不正入力
$checkbox = @array_filter(array_map('sanitize', $_POST['chk']), 'is_string');
if (!is_array($checkbox)
|| count($checkbox) == 0
|| count($checkbox) != count($_POST['chk']))
die("不正入力\n");

sqliteでテストしたときはうまくいきましたが,pogtgresqlではどうかなぁ
Parent: 3212  reply: 3220 返信 編集 削除

[3220] 成功しました

user: matu | created: 2006-08-11 00:19
こんばんわ
achさん返事ありがとうございます。
遅くなってすいません。
成功しました。
原因はSQL文にありました。
> SQLにはこういうこともあろうかとIN(ANY)演算子という便利な演算子が存在します.
とても便利な機能ですね。
> select * in hoge where bar IN (2,4,6);
SQL文を参考にしたら出来ました。
pogtgresqlの方も勉強して行きたい思います。
みなさんありがとうございました。
Parent: 3218  返信 編集 削除
スレッド表示 | フラット表示〕 全トピック 920 件中 205 番目 次≫ ≪前
ページの一番上へ
Googleグックマークに登録 Yahooグックマークに登録 livedoorクリップに登録 @niftyクリップに登録 はてなブックマークに登録 deliciousに登録 Buzzurlに登録 FC2ブックマークに登録
最近更新された掲示板トピックス
管理人Blog
Yahoo Search

最近更新したNote
PHPマニュアル
今日のブックマーク
PHPマニュアル関数検索
関数名を入力し検索ボタンをクリック↑