• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クラスの中で関数・変数を使う方法)

クラスの中で関数・変数を使う方法

noname#244856の回答

noname#244856
noname#244856
回答No.9

今気づいたのですが、NULLとFALSEによる区別を行うならば、変数$doneは用意する必要が無くなりますね。というわけで public function getInvitationTree($root_id, $recursion_level = 0) { ____$tree = array($root_id => null); ____$info = array($root_id => $this->getUser($root_id)); ____$stmt = $this->pdo->prepare(implode(' ', array( ________'SELECT *', ________'FROM `user`', ________'WHERE `sno` = ?', ____))); ____for ($i = 0; $i <= $recursion_level, $i++) { ________array_walk_recursive($tree, function (&$v, $k) use ($stmt, &$info) { ____________if ($v === false) { ________________return; ____________} ____________$stmt->bindValue(1, $k, PDO::PARAM_INT); ____________$stmt->execute(); ____________if (!$stmt->rowCount()) { ________________$v = false; ________________return; ____________} ____________$v = array(); ____________foreach ($stmt as $row) { ________________$v[$row['id']] = null; ________________$info[$row['id']] = $row; ____________} ________}); ____} ____return array( ________'tree' => $tree, ________'info' => $info, ____); } で十分でしょう。

milkkokoa94856
質問者

補足

か、完璧ですΣ(゜д゜lll) やってみたいことが綺麗にできました!! 毎回お手数をお掛けして本当に申し訳ないです。 とりあえずせっかく教えていただいたこのオブジェクト指向でできたもので色々試しているのですが、出来た時の喜びがすごいです(笑) つまずいたときは苦労がすごいですけど、というか今回のような難易度の高いことをしてみるとまだまだつまずいて毎回助けていただいている現状に涙目です。 じっくりコードを見直して色々試してみます。 ちなみにこれは以前 (再帰レベル1指定なので3,4の招待ユーザーは取得しません) とおっしゃっていたのですが、どんどん奥に(2階層の人が紹介した3階層の人)いこうと思うと $recursion_level この数値をいじるといけてしまうのでしょうか? そうなってくるとコードは変わるのでしょうか? せっかくなのでどんどん奥に行ったりしてこの辺の理解を深めようと思います><

関連するQ&A

  • PHPからSQL文で〇〇か〇〇か〇〇という時に

    PHPからMYSQLに問い合わせでご質問です。 実行している文です(SELECT文から) SELECT * FROM users WHERE id = ? AND level = ?' ))); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $level, PDO::PARAM_INT); $stmt->execute(); return $stmt->fetchAll(); } このような感じでユーザーIDとユーザーのレベルを判別しているものですが、IDはセッションを入れレベルに2と3と4の人を抽出という場合がわからずご質問させて頂きました。 ORを使って WHERE id = ? AND level = ? OR id = ? AND level = ? OR id = ? AND level = ? OR id = ? AND level = ? $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->bindValue(2, $level, PDO::PARAM_INT); $stmt->bindValue(3, $id, PDO::PARAM_INT); $stmt->bindValue(4, $level, PDO::PARAM_INT); $stmt->bindValue(5, $id, PDO::PARAM_INT); $stmt->bindValue(6, $level, PDO::PARAM_INT); のような感じで当てはめたいものを書くのかと思ったり、もっときれいな書き方というか正しい書き方がありそうな気がしてご質問させて頂いた限りです。 どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PDO で IN句を利用することができません

    PDOでIN句を使用しているのですが、正しく動作しません。 $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?)'); $stmt->bindValue(1, '123, 456, 789'); $stmt->execute(); var_dump($stmt->fetchAll()); fetchAllを行っても複数のレコードがかえってこず、ヒットした最初の1行のレコードしか取得することができません。PDOでIN句を使用することはできないのでしょうか? DBMSはMySQLを使用して、PHPは5.2.6を使用しています。 ちなみに $stmt = $pdo->prepare('SELECT * FROM hoge where id in (?, ?, ?)'); $stmt->bindValue(1, 123); $stmt->bindValue(2, 456); $stmt->bindValue(3, 789); $stmt->execute(); では、fetchAll で複数のレコードが返ってきます。 どうしてもpreparedで単一のIN句を使いたいのですが、何か良い方法はありますでしょうか?

    • 締切済み
    • PHP
  • PDOのprepareでLIKEの部分一致が使えません・・

    http://d.hatena.ne.jp/Sybian/20070521/p1 のサイトの例のように、LIKE '%文字列%' をprepareしようとしたのですが上手く結果が返りません。 PDOのプリペアステートメントは、 LIKEの部分一致や先頭一致に非対応なのでしょうか? $query="SELECT * FROM table WHERE id=:id OR like name='%:name%'"; $pdo=new PDO('mysql:host=localhost;dbname=database','user','password'); $stmt=$pdo->prepare($query); $stmt->bindValue(':id',$id,PDO::PARAM_INT); $stmt->bindValue(':name',$name,PDO::PARAM_STR); $stmt->execute(); return $stmt->fetchAll(PDO::FETCH_ASSOC);

    • ベストアンサー
    • PHP
  • MySqlのテーブルをPHPで比較して呼び出す方法

    説明が下手でうまく伝わらないかもしれないのですが、やりたいことは画像と合わせ説明させて頂きます。 テーブル内のそれぞれのカラムを呼び出すなどはなんとか出来るようになったので、違うパターンを勉強しております。 例えばmixiのようなSNSに紹介するサイトがあると仮定します。 そこで「山田2号」でログインをした場合、紹介されたのは誰々です。 という風にしてみたいと思います。 画像では、 山田2号でログイン中 「紹介者は下記の人です」 会員番号「1005」山田5号 会員番号「1006」山田6号 会員番号「1007」山田7号 会員番号「1008」山田8号 ・マッチ方法は山田2号のカラムnoの1002とカラムsnoの1002が同じ時にカラムsnoのマッチしたカラムnameを全て表示する。 という感じなのかなとイメージしているのですが実際にやってみると全然うまくいきません。 違うテーブルで会員を呼び出すなどで行っているのは public function getUser($id) { $stmt = $this->pdo->prepare(implode(' ', array( 'SELECT *', 'FROM `user`', 'WHERE `id` = ?', 'LIMIT 1', ))); $stmt->bindValue(1, $id, PDO::PARAM_INT); $stmt->execute(); if (!$stmt->rowCount()) { throw e('該当するユーザーが見つかりません。'); } return $stmt->fetch(); } としています。 この紹介用のテーブル名がsuserだとするとテーブル名変更のほかに条件指定はどのようにするのでしょうか? 自分なりにWHEREで条件をつけlimitも切ってみたりしたのですがうまくいきませんでした。 上記のわかりにくい説明で恐縮なのですが、アドバイスやヒントをいただけませんでしょうか? マッチの方法などがそもそも違うのでしょうか? どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • PDOがうまく動かない

    PDOがうまく動かなくて困っています。 $get_id = $_GET['id']; $stmt = $pdo->query("SELECT * FROM table where hoge = ':id'"); $stmt->bindValue(":id",$get_id, PDO::PARAM_STR); $stmt->execute(); if($row = $stmt->fetch()) { echo "あああ"; } $get_id = $_GET['id']; $stmt = $pdo->query("SELECT * FROM table where hoge = '$get_id'"); if($row = $stmt->fetch()) { echo "あああ"; } 2つ目は「あああ」と表示されるのですが、1つ目は何も表示されません。 よろしくおねがいします。

    • ベストアンサー
    • PHP
  • ステートメントが必要です。???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 下記のコードの一番下の}にステートメントが必要です と出ます。 どういう意味でしょうか? どうか教えてください。 宜しくお願い申し上げます。      記 function blogUpdate($blogs) { $sql = "UPDATE $this->table_name SET title = :title, content = :content, category = :category, publish_status = :publish_status Where id = :id"; $dbh = $this->dbConnect(); $dbh->biginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], PDO::PARAM_INT); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを更新しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } }

    • ベストアンサー
    • PHP
  • php 66行目の関数に矛盾???

    いつも大変お世話になり誠にありがとうございます。 標記の件。 たくさんファイルがあるので、他の箇所に 問題があるのかもしれません。 エラーメッセージは Fatal error: Cannot redeclare Dbc::getBlog() in C:\xampp\htdocs\dbc.php on line 66 です。 度々申し訳ございません。 アドバイスを宜しくお願い申し上げます。      記 <?php require_once('env.php'); Class Dbc { protected $table_name; //1.データベース接続 //引数:なし //返り値:接続結果を返す protected function dbConnect() { $host = DB_HOST; $dbname = DB_NAME; $user = DB_USER; $pass = DB_PASS; $dsn = "mysql:host = $host;dbname = $dbname;charset=utf8"; try { $dbh = new \PDO($dsn,$user,$pass,[ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗'; $e->getMessage(); exit(); }; return $dbh; } //カテゴリー名を表示 //引数:数字 //返り値:カテゴリーの文字列 function setCategoryName($category) { if ($category == '1') { return '日常'; }elseif ($category == '2') { return '非日常'; }else{ return 'その他'; } } //引数:id //返り値:$result public function getBlog($id) { if(empty($id)) { exit('idが不正です。'); } } public function getAllBlog() { $dbh = $this->dbConnect(); //⓵SQLの準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //⓶SQLの実行 $stmt->execute(); //⓷SQLの結果を受け取る $result = $stmt-> fetchall(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } return $result; $dbh = null; } //引数:$id //返り値:$result public function getBlog($id) { ★ここが66行目です。 if(empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); //SQL準備 $stmt = $dbh->prepare('SELECT * FROM blog Where id = :id'); $stmt->bindValue(':id',(int)$id, \PDO::PARAM_INT); //SQL実行 $stmt->execute(); //結果を取得 $result = $stmt->fetch(\PDO::FETCH_ASSOC); if(!$result) { exit('本文がありません。'); } } //return $result; } function delete($id) { exit('idが不正です。'); } return $result;

    • ベストアンサー
    • PHP
  • $dbh = dbConnect();

    いつもお世話になりありがとうございます。 標記の件。 エラーになります。 どう直せばいいでしょうか? エラーメッセージは Fatal error: Uncaught Error: Call to undefined function dbConnect() in C:\xampp\htdocs\blog_create.php:9 Stack trace: #0 {main} thrown in C:\xampp\htdocs\blog_create.php on line 9 です。 コーディングは下記です。 <?php //require_once('form.html'); require_once('blog.php'); $sql = "INSERT INTO table_name(name,title,category,content) VALUES (:name, :title, :category, :content,)"; $dbh = dbConnect(); $dbh->beginTransaction(); try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':id', $blogs['id'], PDO::PARAM_INT); $stmt->bindValue(':name', $blogs['name'], PDO::PARAM_STR); $stmt->bindValue(':title', $blogs['title'], PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], PDO::PARAM_STR); $stmt->bindValue(':post_at', $blogs['post_at'], PDO::PARAM_INT); $stmt->execute(); $stmt->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } blog.php <?php //require_once('dbc.php'); //<?php //class Dbc //{ // protected $table_name; //protected function dbConnect() //{ $dsn = 'mysql:host=localhost;dbname=blog_app;charset=utf8'; $user = 'blog_user'; $pass = 'rhythm0!KT'; try { $dbh = new \PDO($dsn, $user, $pass, [ \PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, ]); } catch (PDOException $e) { echo '接続失敗' . $e->getMessage(); exit(); }; return $dbh; //} function getAll() { $dbh = $this->dbConnect(); //①SQLの準備 $sql = "SELECT * FROM $this->table_name"; //②SQLの実行 $stmt = $dbh->query($sql); //③SQLの結果を受け取る $result = $stmt->fetchall(\PDO::FETCH_ASSOC); return $result; $dbh = null; } $dbh = $this->dbConnect(); $sql = "SELECT * FROM $this->table_name"; $stmt = $dbh->prepare("SELECT * FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); $result = $stmt->fetch(\PDO::FETCH_ASSOC); if (!$result) { exit('本文がありません。'); } return $result; //} //function blogCreate($blogs) { $sql = 'INSERT INTO blog(title, content, category, publish_status) VALUES (:title, :content, :category, :publish_status)'; $dbh = $this->dbConnect(); $dbh->biginTransaction; try { $stmt = $dbh->prepare($sql); $stmt->bindValue(':title', $blogs['title'], \PDO::PARAM_STR); $stmt->bindValue(':content', $blogs['content'], \PDO::PARAM_STR); $stmt->bindValue(':category', $blogs['category'], \PDO::PARAM_INT); $stmt->bindValue(':publish_status', $blogs['publish_status'], \PDO::PARAM_INT); $stmt->execute(); $dbh->commit(); echo 'ブログを投稿しました!'; } catch (PDOException $e) { $dbh->rollBack(); exit($e); } } function delete($id) { if (empty($id)) { exit('idが不正です。'); } $dbh = $this->dbConnect(); $stmt = $dbh->prepare("DELETE FROM $this->table_name Where id = :id"); $stmt->bindValue(':id', (int)$id, \PDO::PARAM_INT); $stmt->execute(); echo 'ブログを削除しました!'; return $result; } //} ?> 度々申し訳ございません。 教えてください。 ご回答のほど宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • SQLインジェクション対策

    SQLインジェクション対策として、変数を直接SQLに埋め込むのではなく、PDOのprepareメソッドを利用して作成したステートメントに値をバインドする形式にする場合、ユーザー定義関数をどのように 修正すればいいですか? function update_item_stock($db, $item_id, $stock){ $sql = " UPDATE items SET stock = {$stock} WHERE item_id = {$item_id} LIMIT 1"; return execute_query($db, $sql); } function execute_query($db, $sql, $params = array()){ try{ $stmt = $db->prepare($sql); return $stmt->execute($params); }catch(PDOException $e){ set_error('更新に失敗しました。'); } return false; } 上記のユーザー定義関数を下記のようにbindValueを用いて表す場合、$stmt->bindValueの部分を 上記のどこに追加すればいいですか? try { $sql = 'UPDATE item_stock SET stock = ?, update_date = ? WHERE item_id = ?'; $stmt = $db->prepare($sql); $stmt->bindValue(1, $update_stock, PDO::PARAM_INT); $stmt->bindValue(2, $date, PDO::PARAM_STR); $stmt->bindValue(3, $item_id, PDO::PARAM_INT); $stmt->execute(); $complete_msg[] = '在庫変更に成功しました。'; } catch (PDOException $e) { $err_msg[] = '更新に失敗しました。理由:' . $e->getMessage(); }

    • 締切済み
    • PHP
  • PHP pdo データが無い場合とある場合

    tablename( id int not null, name text not null, age int ); 的なテーブルがあったとして、id番号と名前は必ずデータがあるが、年齢はデータがあったり無かったりするとします。 $id = 1; $name = "太郎"; $age = ""; だったり $age = "25";だったり シンプルにinsert 書きたいのですが、やはり$ageが空文字の場合と数字で構成される文字の場合でわけないと書けないでしょうか? $sql = "insert into tablename( id,name,age) values (:id,:name,:age); $stmt = $pdo->prepare($sql); $stmt->bindValue(":id", $id, PDO::PARAM_INT); $stmt->bindValue(":name", null, PDO::PARAM_STR); if ($age === "") { $stmt->bindValue(":age ", null, PDO::PARAM_NULL); } else { $stmt->bindValue(":age ", $age , PDO::PARAM_INT); } とわけないと無理?

    • 締切済み
    • PHP