- 締切済み
SQL文について
お世話になります。 POST通信で受け取った内容をデータベースに書き込もうとすると 書き込みに失敗してしまいます。 namespace portfolio; require_once dirname(__FILE__) . '/Bootstrap.class.php'; use portfolio\lib\Database; $db = new Database( Bootstrap::DB_HOST, Bootstrap::DB_USER, Bootstrap::DB_PASS, Bootstrap::DB_NAME); if($_POST !== false){ $dataArr = $_POST; $problem = $dataArr['problem']; $name1 = $dataArr['name1']; $name2 = $dataArr['name2']; $name3 = $dataArr['name3']; $name4 = $dataArr['name4']; } $sql = "INSERT INTO hokuto_problem (problem,name1,name2,name3,name4) VALUES (".$problem.",".$name1.",".$name2.",".$name3.",".$name4.")"; $res = $db->execute($sql); var_dump($res); if($res === true){ echo "処理が成功しました"; }else{ echo "書き込みに失敗しました"; } 上記処理をしようとしたら書き込みに失敗してしまいます Bootstrap.phpでは namespace portfolio; require_once dirname(__FILE__) . './../vendor/autoload.php'; class Bootstrap{ const DB_HOST = 'localhost'; const DB_NAME = 'hokuto'; const DB_USER = 'root'; const DB_PASS = 'root'; const APP_DIR = '/Applications/MAMP/htdocs/DT/'; // const TEMPLATE_DIR = self::APP_DIR.'templates/member/'; const CACHE_DIR = false ; const APP_URL = 'http://localhost:8888/DT/'; const ENTRY_URL = self::APP_URL . 'portfolio/'; public static function loadClass($class){ $path = str_replace('\\', '/', self::APP_DIR . $class . '.class.php'); require_once $path; } } spl_autoload_register( [ 'portfolio\Bootstrap', 'loadClass' ] ); そして、Database.class.phpにおいては amespace portfolio\lib; class Database { public $db_con = null; public $db_host = ''; public $db_user = ''; public $db_pass = ''; public $db_name = ''; public function __construct($db_host, $db_user, $db_pass, $db_name) { $this->db_con = $this->connectDB($db_host, $db_user, $db_pass, $db_name); $this->db_host = $db_host; $this->db_user = $db_user; $this->db_pass = $db_pass; $this->db_name = $db_name; } private function connectDB($db_host, $db_user, $db_pass, $db_name) { $tmp_con = mysqli_connect($db_host, $db_user, $db_pass, $db_name); if ($tmp_con !== false) { return $tmp_con; } else { printf("Connect failed: %s\n", mysqli_connect_error()); exit(); } } public function execute($sql) { return mysqli_query($this->db_con, $sql); } のコードを書いています 初心者に質問で、非常に見辛い面は承知の上で 大変心苦しいですが、何卒、ご回答いただけると幸いです
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- superside0
- ベストアンサー率64% (461/714)
もしかして phpMyAdminで使ったDB接続アカウントと このプログラムで指定しているDB_USERが異なっていて、 テーブルに対してのselect,insert,update,deleteの権限を 後者のアカウントには与えていないということはないですか。 エラー内容を表示させれば、はっきりするでしょうけど。
- AsarKingChang
- ベストアンサー率46% (3467/7474)
>ですので、なぜ書き込みに失敗するのかがわからないんですが、コード的におかしなところはございますか? class Database こいつの、 $this->db_con = $this->connectDB($db_host, $db_user, $db_pass, $db_name); これが、そもそも成功したのかがわからないので、 public function is_connect() { return $this->db_con? true:false; } などを追加したほうがいいかもね。 それで、使う側で、 $db = new Database( これの後、$db->is_connect()で、エラーハンドリング https://www.php.net/manual/ja/mysqli.error.php そもそも、その$this->db_conこいつ自体に、 コマンドを投げるようにした方が、 手っ取り早いでしょうね。それ自体がオブジェクトなので。 if (!$mysqli->query(なんたら)) { printf("Error message: %s\n", $mysqli->error); } //サンプルにもあるが、エラーがあったら、内容を教える if($_POST !== false){ この部分も、これがfalseだった場合の処理がないので、 違和感があります(ただし、この変数falseになる事はないけど) 後、mysqli::queryまたは、mysqli_queryの返り値は mysqli_result|boolになってますので、 public mysqli::query(string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool mysqli_query(mysqli $mysql, string $query, int $result_mode = MYSQLI_STORE_RESULT): mysqli_result|bool if($res === true){ ではなく、 if($res !== false){ の方がいいでしょう。 >戻り値 ¶ >失敗した場合に false を返します。 結果セットを生成するクエリ、 つまり SELECT, SHOW, DESCRIBE あるいは EXPLAIN が成功した場合は、mysqli_query() は mysqli_result オブジェクトを返します。それ以外のクエリが成功した場合は、 mysqli_query() は true を返します。 つまり、成功するとtrue以外を返却する可能性があるのです。 などを、治すのとログを見るのを忘れなければ、 やや簡単に治るかと。
エラーメッセージを見せてください
- AsarKingChang
- ベストアンサー率46% (3467/7474)
なんとなく、あまり意味がないところを書いてしまってます。 最初のファイルの、SQLクエリの、 どこを経由してどんなエラーが出てますか? こういう場合、原因を考えるより前に、 エラーログを見る癖をつけたほうが良いかと思います。 このソースで気になることは、 if($_POST !== false){ この中に全部入れたほうがいいかとは思いますよ。 } じゃないと、変数の実体がないまま、SQLクエリの作成部に 行ってしまいますので。 なのですが、 if($_POST !== false){ これは、そもそも、falseにはならないかと。 $sql = "INSERT INTO hokuto_problem (problem,name1,name2,name3,name4) VALUES (".$problem.",".$name1.",".$name2.",".$name3.",".$name4.")"; これを、一度echoしてみましょう。 で、それをコマンドラインや、phpmyadminで実行できるのか? を確認 $db = new Database( この部分、$dbが出来ていてもできていなくても、 通過しているので、 $Database::db_conを見るようにした方が良いかと。 恐らくですが、クエリではなくて、 DBそのものが動いてないと思います。 (ここは情報不足の状態での、「感」でしかないですが)
補足
PhpmyAdminの方で同じSQL文を実行しましたが、データベースに書き込みはできました。 ですので、なぜ書き込みに失敗するのかがわからないんですが、コード的におかしなところはございますか? 無知で同じことを聞いてしまったら申し訳ございません