プログラム初心者です
質問1
HTMLのフォームのチェックボックスから配列でphpに値を渡したときにチェックした値が1個しかなかった時には配列として受け取っているのでしょうか?それとも一個しかない場合は変数として受けとっているのでしょうか?
現状ではissetで調べて値がある場合にはその配列をforeachで取り出して実行しています(実際にやってみたら値1個でも動いていますが気になったので教えてください)
値のチェックはissetのみでいいでしょうか?
質問2
MySQLの方は、チェックの個数分のレコードを削除するために繰り返し処理の中でsqlを最大20回発行するのはダメな処理ですか?(チェック1個の場合は1回のみsqlを発行しています)
一般的に使われているならこれでいこうと思います
よろしくお願いします
No.1ベストアンサー
- 回答日時:
(インデントには全角スペースを使わせていただきます。
)【回答1】
1個以上 → 配列です。
0個 → 受け取りません。
手を抜くなら isset だけで十分ですが、厳密に "不正な" リクエストも考慮するならば is_string / is_array を活用した型チェックも欠かせません。毎回全部このチェックを記述するのは面倒なので適当に関数を作っておくといいでしょう。あらゆるニーズに対応できるように作成した関数があるので良ければ活用してください。
汎用的な変数構造フィルタリング関数
http://qiita.com/mpyw/items/c39b9ee695a5c2e74627
構造をフィルタリングすると同時にUTF-8バリデーションが行われ、UTF-8として正しくないバイト列を検知して無効化します。他の言語ではこういったエンコーディングバリデーションをするのがほぼ当たり前になってるようですが、PHPでは何故かあんまり浸透していないみたいですね・・・
使用例:
名前: <input type="text" name="name" value="" /><br />
<input type="checkbox" name="checks[]" value="A" />A<br />
<input type="checkbox" name="checks[]" value="B" />B<br />
<input type="checkbox" name="checks[]" value="C" />C<br />
備考1: <input type="text" name="options[]" value="" /><br />
備考2: <input type="text" name="options[]" value="" /><br />
↓
extract(filter_struct_utf8(INPUT_POST, array(
'name' =>
FILTER_STRUCT_FULL_TRIM,
'checks' =>
FILTER_STRUCT_FORCE_ARRAY,
'options' =>
FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_FULL_TRIM,
)));
これで
$name … 両端がトリミングされた文字列
$checks … 一次元配列
$options … 要素が全てトリミングされた一次元配列
になることが必ず保証されます。
しかし、チェックボックスに関しては、これではフォーム上に存在するものかどうかまでの確認は出来ません。もしそれを行いたいのであれば、そもそも「値」でチェックしようとするのをやめ、「キー」でチェックしてください。具体的には下記のようにします。
名前: <input type="text" name="name" value="" /><br />
<input type="checkbox" name="checks[0]" value="A" />A<br />
<input type="checkbox" name="checks[1]" value="B" />B<br />
<input type="checkbox" name="checks[2]" value="C" />C<br />
備考1: <input type="text" name="options[]" value="" /><br />
備考2: <input type="text" name="options[]" value="" /><br />
↓
$default_checks = array('A', 'B', 'C');
extract(filter_struct_utf8(INPUT_POST, array(
'name' =>
FILTER_STRUCT_FULL_TRIM,
'checks' =>
array_fill(0, count($default_checks), null),
'options' =>
FILTER_STRUCT_FORCE_ARRAY | FILTER_STRUCT_FULL_TRIM,
)));
これで $checks の各要素が NULL かどうかの判定を行えばいいだけです。変数が定義済みであることが確定しているので、 isset を使う必要はありません。単純に !== null として比較してください。
【回答2】
1回で全部削除できますよ。PDOのプリペアドステートメントを用いるならば、上記の $checks を受け取った後、
foreach ($checks as $k => $v) {
if ($v !== null) {
$params[] = $default_checks[$k];
}
}
if (!empty($params)) {
$sql = sprintf(
'DELETE FROM table WHERE checks IN (%s)',
implode(', ', array_fill(0, count($params), '?'))
);
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
}
というように、「WHERE ... IN ( ... )」の条件部分に可変長のプレースホルダを設けてください。なお、$v は NULL でないかどうかを判定するためだけに用い、それ以外の用途に使ってはいけません。それが「A」「B」「C」のどれかである保証はないからです。
あと、言うまでもないですがCSRF攻撃対策は行ってくださいね・・・!
No.2
- 回答日時:
Mysqli手続き型ならこうですかね・・・
(手続き型はコードが長くなるのであんまり好きじゃないですが)
foreach ($checks as $k => $v) {
if ($v !== null) {
$params[] = $default_checks[$k];
}
}
if (!empty($params)) {
$sql = sprintf(
'DELETE FROM table WHERE checks IN (%s)',
implode(', ', array_fill(0, count($params), '?'))
);
$stmt = mysqli_prepare($link, $sql);
call_user_func_array(
'mysqli_stmt_bind_param',
array_merge(
array($stmt),
array(str_repeat('s', count($params))),
$params
)
);
mysqli_stmt_execute($stmt);
}
Mysqli使ったこと無い上にデバッグしてないのでミスあったらごめんなさい m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Java Java 南京錠 2 2023/02/04 11:46
- JavaScript javaScriptで画面に値を入れるには 1 2022/08/14 12:27
- Excel(エクセル) countif関数について質問 4 2022/06/14 12:11
- PHP PHP MySql ページング 2 2022/09/20 06:38
- C言語・C++・C# このプログラミングの問題を教えて欲しいです。 キーボードから整数kを入力し、kが配列aの中に何個存在 2 2022/12/19 22:50
- Excel(エクセル) エクセルでエラーを無視して一番左側のセルの値を返したい 2 2023/07/27 13:06
- Java Java モンスターブリーダー 1 2023/02/05 09:44
- PHP クエリObjectをforeachで回す時に、次のレコードへ移動せずに次のレコードを取得したい 2 2022/07/28 15:29
- JavaScript 助けてください‼︎ javascriptで質問があります。 配列を定義して、 29342、45342 3 2022/06/26 22:06
- C言語・C++・C# このプログラミングの問題を教えてほしいです。 キーボードからデータ数nとn個のデータを入力し、平均値 3 2022/12/19 22:51
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
チェックボックスのvalueを連結...
-
変数の書き方について
-
配列をhiddenで
-
入力した部分を表示させたまま...
-
phpとデータベース
-
PHP/SQL 更新フォーム エラーに...
-
フォームの内容をクッキーに保...
-
PHPで、ボタンを押すと同じペー...
-
メール送信フォーム
-
複数のチェックボックスの確認
-
検索時の選択内容を保持する方法
-
PHP ボタンが押されたら処理を...
-
POSTやGETの変数をフォーム無し...
-
PHP初心者です。何処がエラーな...
-
カウンタのリセット
-
phpで分からないエラーが出てし...
-
チェックボックスを使った複数...
-
複数選択の方法が分からないの...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
HTMLで前の画面に戻る時、入力...
-
<input type="hidden" >で配列...
-
PHP ボタンが押されたら処理を...
-
検索時の選択内容を保持する方法
-
DBの値をチェックボックスに反...
-
ラジオボタンをsessionで使いたい
-
パラメーターを隠す
-
PHPで画像の渡しが上手く行きま...
-
フォームへの前回入力値をクリ...
-
フォームボタンを押すたびに数...
-
フォームでのリセットを使う方法
-
syntax error, unexpected '}' ...
-
PHPの関数実行
-
テキストボックスに初期値を入れる
-
phpで分からないエラーが出てし...
-
入力した部分を表示させたまま...
-
入力フォーム→確認画面→送信画...
-
画面が更新されてもチェックボ...
-
Javascript→PHPに...
-
配列をhiddenで
おすすめ情報