質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

Q&A

2回答

444閲覧

Maria DBに格納している配列データをチェックボックスで表示したい

black_onion

総合スコア7

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

checkbox

checkboxは、GUIのエレメントです。また、HTML<input>タグのtype属性で扱われる値を指します。

MariaDB

MariaDBは、MySQL派生のオープンソースなリレーショナルデータベースシステムです。 また、MySQLとほぼ同じデータベースエンジンに対応しています。

0グッド

0クリップ

投稿2018/10/22 08:35

編集2018/10/22 10:33

PHPとMaria DBを用いてスケジュール管理のデータベースを作成しております。
入力FormからテキストデータはSQLの方に格納され、読みだした時にも正常に読み出しされるのですが、チェックボックスを使用して配列でSQLに格納したデータを読みだした時にチェックボックスにて表示したいのですが、うまく表示されません。
Warning: array_diff(): Argument #1 is not an array in C:\xampp\xxx\xxx.php on line 163
※$diffValue = array_diff($row["productarry"], $product);のところ

SQL側には"productarry"というカラムは作成されていて、中身も入っているように見えます。
配列以外のデータはテキストで表示されているので問題ないとは思うのですが、、、
SQLからのデータを配列として見られていないのか、そもそも配列として認識されていないのか、はたまた別理由なのか見当が付きません。
ご指導いただければと思います。

PHP

1 //MySQLデータベースに接続する 2 $pdo = new PDO($dsn, $user, $password); 3 $pdo->setAttribute(PDO::ATTR_EMULATE_PREPARES, false); 4 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 5 $sql = "SELECT * FROM データベース名 WHERE id LIKE(:id)"; 6 $stm = $pdo->prepare($sql); 7 $stm->bindValue(':id', "{$id}", PDO::PARAM_STR); 8 $stm->execute(); 9 $resulte = $stm->fetchAll(PDO::FETCH_ASSOC); 10 foreach ($resulte as $row) { 11 12********************** 13if (isSet($row["productarry"])){ 14 // 「product」かどうか確認する 15 $product = ['製品A','製品B','製品C','製品D','製品E']; 16 $diffValue = array_diff($row["productarry"], $product); 17 // 規定外の値が含まれていなければOK 18 if (count($diffValue)==0){ 19 // チェックされている値を取り出す 20 $productarry = $row["productarry"]; 21 } else { 22 $productarry = []; 23 } 24 } 25 26 27 echo "<div class='form-group'>", "<div class='col-lg-8'>", "<div class='checkbox' id='product'>", "<h4>", "Product Type", "</h4>", 28 "<label>", "<input type='checkbox' name='productarry[]' value='製品A' $productarry", "製品A", "</label>", "<span style='margin-right: 25px;'>", "</span>", 29 "<label>", "<input type='checkbox' name='productarry[]' value='製品B' > $productarry", "製品B", "</label>", "<span style='margin-right: 25px;'>", "</span>", 30 "<label>", "<input type='checkbox' name='productarry[]' value='製品C' > $productarry ", "製品C", "</label>", "<span style='margin-right: 25px;'>", "</span>", 31 "<label>", "<input type='checkbox' name='productarry[]' value='製品D' > $productarry", "製品D", "</label>", "<span style='margin-right: 25px;'>", "</span>", 32 "<label>", "<input type='checkbox' name='productarry[]' value='製品E' > $productarry", "製品E", "</label>", "<span style='margin-right: 25px;'>", "</span>", 33 "<br>", 34 "<br>", 35 "</div>", 36 "</div>", 37 "</div>";

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yambejp

2018/10/22 09:47

xxxxが複数箇所ありますが、これは同じデータなのか違うデータなのかはっきりさせた方がよいです
black_onion

2018/10/22 10:34

xxxx部は製品名となり全て違うデータとなります。更新しました。アドバイスいただければ幸いです。
guest

回答2

0

array_diffって配列と配列の差を計算するんじゃなかったでしたっけ?
$row["productarry"]が配列ではないのがエラーの原因だと思います。

foreach ($resulte as $row) {
$diffValue = array_diff($row["productarry"], $product);
}

↓↓↓
とりあえず配列と配列を比較すればこの箇所においてはエラーは出てこないと思います
$tmparr=array();
foreach ($resulte as $row) {
$tmparr[] = $row["productarry"];
}

$diffValue = array_diff($tmparr, $product);

投稿2018/10/23 01:56

ms5025

総合スコア292

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

black_onion

2018/10/24 05:46

申し訳ありません。こちらを見落としておりました。 別の方からもありましたが、SQLに格納されているデータが配列とはなっていないようですので、unserializeしてみてから、比較になるのかなぁと考えております。
guest

0

productarryカラムに入っているデータのウチ、'製品A','製品B','製品C','製品D','製品E'
に合致するものだけ抜き出すのですかね?

PHP

1$rows=[]; 2try{ 3 $sql = "SELECT productarry FROM tbl where 1 "; 4 $product = ['製品A','製品B','製品C','製品D','製品E']; 5 $sql.= "and productarry in(".implode(",",$product).") "; 6 $stm = $pdo->prepare($sql); 7 $stm->execute(); 8 $rows = $stm->fetchAll(PDO::FETCH_ASSOC); 9}catch(PDOException $e){ 10 die($e->getMessage()); 11} 12$data=[]; 13echo <<<eof 14<div class='form-group'> 15<div class='col-lg-8'> 16<div class='checkbox' id='product'> 17<h4>Product Type</h4> 18eof; 19foreach ($rows as $row) { 20 $val=htmlspecialchars($row["productarry"]); 21 echo "<label><input type='checkbox' name='productarry[]' value='{$val}'>{$val}</label><span style='margin-right: 25px;'></span>\n"; 22} 23

調整版

SQLの調整と、ヒットしたものだけチェックする処理をいれました

PHP

1$rows=[]; 2$id=2; 3 4$product = ['製品A','製品B','製品C','製品D','製品E']; 5try{ 6 $sql = "SELECT productarry FROM tbl where 1 "; 7 $sql = "and id=? "; 8 $sql.= "and productarry in('".implode("','",$product)."') "; 9 print $sql;//debug 10 $stm = $pdo->prepare($sql); 11 $stm->execute([$id]); 12 $rows = $stm->fetchAll(PDO::FETCH_ASSOC); 13}catch(PDOException $e){ 14 die($e->getMessage()); 15} 16$data=array_map(function($x){return $x["productarry"];},$rows); 17echo <<<eof 18<div class='form-group'> 19<div class='col-lg-8'> 20<div class='checkbox' id='product'> 21<h4>Product Type</h4> 22eof; 23foreach ($product as $val) { 24 $checked=(in_array($val,$data)!==false)?" checked":""; 25 echo "<label><input type='checkbox' name='productarry[]' value='{$val}'{$checked}>{$val}</label><span style='margin-right: 25px;'></span>\n"; 26}

idをpostで渡す

PHP

1<?PHP 2$rows=[]; 3$id=filter_input(INPUT_POST,"id"); 4$data=[]; 5$product = ['製品A','製品B','製品C','製品D','製品E']; 6try{ 7 $sql = "SELECT productarry FROM tbl where 1 "; 8 if(!is_null($id) and $id!==false){ 9 $sql.= "and id=? "; 10 array_push($data,$id); 11 } 12 $sql.= "and productarry in('".implode("','",$product)."') "; 13 print $sql;//debug 14 print_r($data); 15 //$stm = $pdo->prepare($sql); 16 //$stm->execute($data); 17 //$rows = $stm->fetchAll(PDO::FETCH_ASSOC); 18}catch(PDOException $e){ 19 die($e->getMessage()); 20} 21$data=array_map(function($x){return $x["productarry"];},$rows); 22echo <<<eof 23<div class='form-group'> 24<div class='col-lg-8'> 25<div class='checkbox' id='product'> 26<h4>Product Type</h4> 27eof; 28foreach ($product as $val) { 29 $checked=(in_array($val,$data)!==false)?" checked":""; 30 echo "<label><input type='checkbox' name='productarry[]' value='{$val}'{$checked}>{$val}</label><span style='margin-right: 25px;'></span>\n"; 31} 32?> 33<hr> 34<form method="post"> 35id test:<select name="id"> 36<option value="1">1</option> 37<option value="2">2</option> 38<option value="3">3</option> 39</select> 40<input type="submit" value="go"> 41</form> 42

投稿2018/10/22 10:51

編集2018/10/23 05:07
yambejp

総合スコア114839

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

black_onion

2018/10/23 03:16

回答ありがとうございます。 表示は'製品A','製品B','製品C','製品D','製品E'全てしますが、チェックの入るものはproductarryカラムに入っているものだけにしたいと考えています。(そこから更にチェック外したり付けたりして更新したいので) $sql = "SELECT productarry FROM tbl where 1 ";のtcb1と1をpostされてきたidに変更しこのコードを実施してみたのですが、 SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'A','製品B','製品C','製品D','製品E')' at line 1 となってしまいます。※製品名は本当は別テキストです これはSQL側に配列として認められていないという事でしょうか。 SQLに格納する際にserializeしてBLOBにしているのですが、それは必要無いもしくは戻す際にunserializeしなければならないのでしょうか(http://php.net/manual/ja/function.unserialize.phpを見る限り) アドバイスいただければと思います。
yambejp

2018/10/23 03:27

調整版追記しました。おかしかったら指摘してください
black_onion

2018/10/23 03:38

早速の回答ありがとうございます。 何処が変わったのか("''"でしょうか)よくわからなくて申し訳ないのですが、以下のエラーが出てしまいます。 SQLSTATE[HY000]: General error: 2031 やはりSQL側の問題なのでしょうか。。。
yambejp

2018/10/23 03:49

調整版にdebug行追加しました SELECT productarry FROM tbl where 1 and productarry in('製品A','製品B','製品C','製品D','製品E') って表示されませんか?
black_onion

2018/10/23 04:03

ありがとうございます。 たしかに表示されます。idで検索かけているせいか FROM データベース名 where id LIKE(:id) も表示されます。 この表示が出るという事は、どこが悪さしているのでしょうか?
yambejp

2018/10/23 04:08

id=2でよいのですよね?idの箇所は追記しました。
black_onion

2018/10/23 04:59

こんなに付き合ってもらってありがとうございます。 id=前のページからのpostされた値になります。後出しの情報になってしまって申し訳ありませんが、前のページからidをpostしてそのidを検索indexとして他のカラムからテキストを抜き出して表示しています。 $id = $_POST["id"]; 自分の考えとしては"id"をキーとしてその行の他のカラムのテキストデータとこの配列をチェックボックスに表示したいと考えています。 アドバイスあればよろしくお願いします。
yambejp

2018/10/23 05:07

idの渡し方を追記しておきました
black_onion

2018/10/23 05:29

幾つか質問があります。 $id=filter_input(INPUT_POST,"id"); ここのidは前ページからpostされたものですよね? 他のテキストを検索するために $id = $_POST["id"]; が既にあるのですが、そちらは消した方がよいのでしょうか? また、下記は何故必要なのでしょうか? <hr> <form method="post"> id test:<select name="id"> <option value="1">1</option> <option value="2">2</option> <option value="3">3</option> </select> <input type="submit" value="go"> </form> 上記を書き込まない場合以下のエラーが表示されます。 SELECT productarry FROM テーブル名 where 1 and id=? and productarry in('製品A','製品B','製品C','製品D','製品E') Array ( [0] => 2358 ) 質問ばかりで申し訳ありません。 よろしくお願いします。
yambejp

2018/10/23 05:36

> $id = $_POST["id"]; > が既にあるのですが、そちらは消した方がよいのでしょうか? これは古い書き方なので消してください。 > また、下記は何故必要なのでしょうか? これはpostを送ったときのSQL文を確認するための処理です。 デバッグ用なので、動作確認ができたらとくに不要です
yambejp

2018/10/23 06:47 編集

かぶった
black_onion

2018/10/23 06:07

回答ありがとうございます。 消して動作確認をしたところ SELECT productarry FROM satest where 1 and id=? and productarry in('製品A','製品B','製品C','製品D','製品E') Array ( [0] => 2358 ) が表示されるという事は SQLの productarryに配列で('製品A','製品B','製品C','製品D','製品E')がいないという事でしょうか。
yambejp

2018/10/23 06:14

同SQL文を実行して戻り値がないならそのidで合致するproductarryが存在しない可能性が高いです。 コメントアウトした $stm = $pdo->prepare($sql); $stm->execute($data); $rows = $stm->fetchAll(PDO::FETCH_ASSOC); echo count($rows); で、$rowsが空(0件)なんですよね?
black_onion

2018/10/23 06:40

SELECT productarry FROM satest where 1 and id=? and productarry in('製品A','製品B','製品C','製品D','製品E') Array ( [0] => 2364 ) の表示なので存在していないのかとおもいます。 MySQLを使っているので、確認してみたところ同じid上のproductarryには a:3:{i:0;s:5:"製品A".... のようにBLOB型で配列は入っているように見えるのですが、、、
yambejp

2018/10/23 06:47 編集

BLOB型じゃなくておそらくjson型ですね そうなると検索の書式が仕方が違います でも、s:5:"製品A"がホントなら普通のJSONではないかなぁ・・・
black_onion

2018/10/23 07:33

SQLに格納する際に入力FormからチェックされてPostされた値を $productarry = serialize($_POST["product"]); としてSQLに格納しています。 で、今、MySQLにてデータ型を見たのですが、JSONがありません。 チェックボックスに戻すのはやはり難しい物なんですね。
yambejp

2018/10/23 08:59

serializeスル前の$_POST["product"]の値がどういうものかによるでしょうね 検索をさせるためのSQLなのにぐちゃっとしたデータを入れたら意味ないです 検索させやすいようなデータを投入するよう構造を変える必要がありそうです
black_onion

2018/10/24 05:51

格納するためのphpは if (isset($_POST['product']) && is_array($_POST['product'])) { $productarry = serialize($_POST["product"]); で、pdoでsqlに入れているので、戻すときに $productarry=unserialize($row["productarry"]); が必要なのかなぁと思いはじめてきました。 もう少し考えてみます。 アドバイスありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問