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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

Q&A

解決済

1回答

4786閲覧

テーブルが作成されない

gyojin

総合スコア94

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

PDO

PDO(PHP Data Objects)はPHPのデータベース抽象化レイヤーです。

PHP

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

0グッド

0クリップ

投稿2016/01/31 07:29

編集2016/02/01 06:32

テーブルを作成するphpのリストです。
おそらく単純ミスだと思いますがテーブルが作成されず、私の環境ではエラーも出ません。
どこが間違っているのでしょうか?(リストはほぼそのままで実行できると思います)

ご指摘うけましたので質問を修正します。
dbの接続は問題ありません
可変変数に関してですが
$string="CREATE TABLE userTable(? ?, ? ?, ? ?, 〜続く )"の形で意図した形です
SQLについては"create table userTable(Id int, inTime datetime, outTime dateTime, comment text);"を
直で入力して確かめています
最終的にはprepareをやめqueryにして$stringに直接修正する形で実行を確認しています。(質問投稿後に確認しました)がなぜprepareで動作がうまくいかなかったかはわかりません

php

1<?php 2//db_controle class 3//db_configで指定されたテーブルを探し、無ければ作成し、あれば 4$db_controle=new db_controle(); 5print "<pre>"; 6print_r($db_controle); 7print "</pre>"; 8 9class db_controle{ 10 11 private $errorMessage=null; 12 public $constructError=null; 13 14 //db_configからカラムを受け取り 15 //attendanceAndLeavingTable,userTableを作成する 16 function __construct(){ 17 require(dirname(__FILE__)."/db_config.php"); 18 //接続 19 try{ 20 $this->PDO=new PDO("mysql:host=".$host.";dbname=".$db,$user,$password); 21 22 //テーブルネームリストに従い 23 //テーブルを確認、作成する 24 foreach($tableNameList as $tableName){ 25 $result=$this->CreateTable($tableName); 26 if( $result===false ){ 27 $this->constructError="false"; 28 $this->execute=array_keys($$tableName); 29 return; 30 } 31 } 32 return; 33 //接続失敗 34 }catch (PDOException $e) { 35 $this->errorMessage= "PDO connect error! " . $e->getMessage(); 36 $this->constructError=false; 37 return; 38 } 39 40 41 } 42 43 //引数に従い 44 //テーブルの作製を行う 45 private function CreateTable($tableName){ 46 require(dirname(__FILE__)."/db_config.php"); 47 $question=$this->gattaiArray($$tableName); 48 $string="CREATE TABLE ".$tableName." (".implode(' ', array_fill(0,count($question),'?') ).")"; 49 $stmt=$this->PDO->prepare($string); 50 if( $stmt===false ){ 51 $this->errotMessage="CreateTable create table prepare error"; 52 $this->$tableName=$string; 53 $this->$tableName->question=$question; 54 $this->PDO=null; 55 return false; 56 } 57 $stmt->execute($question); 58 if( $stmt===false ){ 59 $this->errotMessage="CreateTable create table execut error"; 60 $this->$tableName=$string; 61 $this->$tableName->question=$question; 62 $this->PDO=null; 63 return false; 64 65 } 66 $this->$tableName=$string; 67 $this->question=$question; 68 return; 69 70 71 } 72 //エラー取得メソッド 73 public function getError(){ 74 return $this->errorMessage; 75 } 76 //配列とキーを全部数値添字の配列に組み替える 77 //ついでにカンマもつける 78 private function gattaiArray($arrayName){ 79 require(dirname(__FILE__)."/db_config.php"); 80 $keyArray=array_keys($arrayName); 81 $valueArray=array_values($arrayName); 82 $result=array(); 83 foreach($keyArray as $index => $key){ 84 $result[]=$key; 85 $result[]=$valueArray[$index].","; 86 } 87 //最後のカンマを外す 88 $last=array_pop($result); 89 $result[]=substr($last, 0, -1); 90 return $result; 91 92 } 93} 94?> 95 96

php

1<?php 2$host="hogehost"; 3$user="hogeuser"; 4$password="hogepassword"; 5$db="hogedb"; 6$tableNameList=array("userTable"); 7 8$userTable=array( 9 "ID"=>"int", 10 "inTime"=>"datetime", 11 "outTime"=>"datetime", 12 "comment"=>"text" 13) 14?> 15 16コード

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

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

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

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

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

usk

2016/02/01 06:08 編集

文体を整えたいので、追加要望などを回答欄に記載します。
guest

回答1

0

ベストアンサー

逆にお尋ねしたいのですが、どこまで正確に(ご自身の意図通りに)動作しているか確認されましたか?
例:

  1. DBの接続は正しく行われておりますか?
  2. 可変変数の中身は想定通りの値が含まれていますか?
  3. 各関数の引数、戻り値は想定通りの値が設定されておりますか?
  4. SQL 文は正しく生成されていらっしゃいますか?

→ 生成されたSQLをPHP以外で実行した場合、正しくテーブルが作成されますか?
5. SQLの実行結果は、ちゃんと確認されましたか?

どこが間違っているのかは、質問者様が一番詳しいはずです。
さもなければ、ちゃんとデバッグ処理を行っていないということになります。
「どこかのサイトを参考にしてコードを記載したけど、動かないー。どこが悪いか見つけてー」ではなく、面倒でも一つ一つのステップ毎に処理結果を確認し、ご自身の記載されたプログラムが意図通りの動作をしているかどうか確認してください。
(意図通りの動作をしていない箇所 = 間違っている箇所になります)

なお、こういう質問のされ方は、丸投げと判断されかねないです。
もう少し、何が正しく行えていないかを確認の上、具体的にどうしたいのかを質問するようにしたほうが良いと思います。


。。。と文句を言いつつも、気になったので調べてみました。

テーブルが作成されない原因:
プログラム中に生成されるSQL (CREATE TABLEの構文) が明らかにおかしいです。
正しいCREATE文を作成するようにしてください。

エラーが吐かれない原因:
DB実行後の評価方法がおかしいです。
execute の戻り値に対して、Boolean の評価を行って下さい。

PHP

1// SQL実行:executeの処理結果は戻り値($ret)にセットされます。 2$ret = $stmt->execute($question); 3if($ret===false){ 4 // エラー処理 5}

投稿2016/02/01 06:08

編集2016/02/01 06:28
usk

総合スコア397

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

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

gyojin

2016/02/01 06:41 編集

createの構文がおかしい?!のは予想外でした。 今、質問を修正したのですが queryに変えて一応動くようにはなったので・・ なんにせよ、もう一度リストを見直してみようと思います >エラーが吐かれない原因: これは完全に私のexecuteの解釈が間違っていました。 ありがとうございます。queryに直して動いたのもqueryの解釈は間違っていなかったからでしょう。このあたりは私の知識はだいぶ混乱している様です。
usk

2016/02/01 06:49 編集

(先ほどの回答では毒を吐いちゃってごめんなさいです・・・) > $string="CREATE TABLE userTable(? ?, ? ?, ? ?, 〜続く )"の形で意図した形です 確か、プレースホルダーを使ってSQLの構文を補完するようなことはできないです。 プレースホルダは、単純に "?" の部分が別のワードで設定されるのではありません。 かなり乱暴な言い方すれば、値に対してのみ利用できると考えていただけたらと思います。 > prepareで動作がうまくいかなかったかはわかりません prepare ではSQLの構文チェックはしておりません。 単純にDBの接続状態を確認して、実行準備が出来たら Statement を返却するのです。
gyojin

2016/02/01 06:57 編集

>かなり大雑把な言い方すれば、値に対してのみ利用できると考えていただけたらと思います。 わざわざ解説ありがとうございます。合点がいきました。 queryで書き直してしまったのですがprepareとexecuteで動くように今一度書き直して試してみようと思います。 重ねてお礼申し上げます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問