皆様、いつもお世話になっております。
このようなテーブルがありまして、フォームで入力すると?プレースホルダにフォームから渡された値がバインドされて、mysqlのテーブルに新しい行が挿入されるようにしたいのです。
php
1こちらの方法でフォームを使わず変数に直接値を挿入すると、INSERT INTOに成功します。 2 3<?php 4 5define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); 6define('DB_USER', 'C9_USER'); 7define('DB_PASSWORD', ''); 8 9try{ 10 11 $company_name = '株式会社どこか'; 12 $assigned_person = 'たなか'; 13 $website = 'website.com'; 14 $phone = '09098787867'; 15 $email = 'email@email.com'; 16 $password = '12345'; 17 18 $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); 19 /*c_numberとidは別処理でインクリメントさせるよていなので手動で入力、ここではわざとc_number=CP4とid=4で固定しています。*/ 20 $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP4", "4", ?, ?, ?, ?, ?, ?)'); 21 $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); 22 23 echo '企業名:'.$company_name.'</br>'; 24 echo '担当者:'.$assigned_person.'</br>'; 25 echo 'ウェブサイト:'.$website.'</br>'; 26 echo '電話番号:'.$phone.'</br>'; 27 echo 'メール'.$email.'</br>'; 28 echo 'パスワード:'.$password.'</br>'; 29 30 echo "登録しました"; 31 } catch (PDOException $e) { 32 print('Error:'.$e->getMessage()); 33 echo "エラーが起きました"; 34 die(); 35 }
上記の方法ではinsert intoに成功します。
しかし、formを使った以下のphp側で受け取った値をexecute()内に与えてバインドさせる方法ですと、新しい行の挿入に失敗するのですが、原因が分かりません。
formからの値をバインドさせるこちらの方法だと失敗します・・・。 <?php define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); define('DB_USER', 'C9_USER'); define('DB_PASSWORD', ''); try{ $company_name = $_POST['cName']; $assigned_person = $_POST['tanto']; $website = $_POST['website']; $phone = $_POST['tel']; $email = $_POST['email']; $password = $_POST['password']; $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); /*c_numberとidは別処理でインクリメントさせるよていなので手動で入力、ここではわざとc_number=CP4とid=4で固定しています。*/ $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP4", "4", ?, ?, ?, ?, ?, ?)'); $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); echo '企業名:'.$company_name.'</br>'; echo '担当者:'.$assigned_person.'</br>'; echo 'ウェブサイト:'.$website.'</br>'; echo '電話番号:'.$phone.'</br>'; echo 'メール'.$email.'</br>'; echo 'パスワード:'.$password.'</br>'; echo "登録しました"; } catch (PDOException $e) { print('Error:'.$e->getMessage()); echo "エラーが起きました"; die(); } ?> <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <div> <label for="cName">企業名</label> <input type="text" id="cName" name="cName"/> </div> <div> <label for="tanto">担当者の名前</label> <input type="text" id="tanto" name="tanto"/> </div> <div> <label for="website">企業のウェブサイト</label> <input type="text" id="website" name="website"/> </div> <div> <label for="tel">電話番号</label> <input type="tel" id="tel" name="tel"/> </div> <div> <label for="password">パスワード</label> <input type="password" id="password" name="password"/> </div> <div> <label for="email">メールアドレス</label> <input type="email" id="email" name="email"/> </div> <input type="submit" value="登録"/> </form> </body> </html>
どのようにしたら、formで入力した値がsqlの疑問符プレースホルダにバインドされるのでしょうか?
アドバイスとご指導のほどよろしくお願いします。
皆様のご意見を基に、次のようなコードにしたら私の望んでいる結果を出力できるようになりました。
<?php define('DSN', 'mysql:host=127.0.0.1;port=3306;dbname=mydb;charset=utf8;'); define('DB_USER', 'C9_USER'); define('DB_PASSWORD', ''); if (!empty($_POST)) { try{ $company_name = filter_input( INPUT_POST, "cName"); $assigned_person = filter_input( INPUT_POST, "tanto"); $website = filter_input( INPUT_POST, "website"); $phone = filter_input( INPUT_POST, "tel"); $email = filter_input( INPUT_POST, "email"); $password = filter_input( INPUT_POST, "password"); $dbh = new PDO(DSN, getenv(DB_USER), DB_PASSWORD); $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); /*c_numberとidは別処理でインクリメントさせる予定なので、ここではわざとc_number=CP6とid=6で固定しています。*/ $stmt = $dbh->prepare('insert into BeginnersTech.Companies values ("CP6", "6", ?, ?, ?, ?, ?, ?)'); //疑問符プレースホルダへ挿入したい場合は、execute()の()内に変数を入れるだけで自動的にバインドされる。 $stmt->execute([$company_name,$assigned_person,$website,$phone,$email,$password]); echo '企業名:'.$company_name.'</br>'; echo '担当者:'.$assigned_person.'</br>'; echo 'ウェブサイト:'.$website.'</br>'; echo '電話番号:'.$phone.'</br>'; echo 'メール'.$email.'</br>'; echo 'パスワード:'.$password.'</br>'; $company_name = ""; $assigned_person = ""; $website = ""; $phone = ""; $email = ""; $password = ""; echo "登録しました"; } catch (PDOException $e) { print('Error:'.$e->getMessage()); echo "エラーが起きました"; echo $e->getMessage(); die(); } } ?> <!doctype html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>Document</title> </head> <body> <form action="" method="post"> <div> <label for="cName">企業名</label> <input type="text" id="cName" name="cName"/> </div> <div> <label for="tanto">担当者の名前</label> <input type="text" id="tanto" name="tanto"/> </div> <div> <label for="website">企業のウェブサイト</label> <input type="text" id="website" name="website"/> </div> <div> <label for="tel">電話番号</label> <input type="tel" id="tel" name="tel"/> </div> <div> <label for="password">パスワード</label> <input type="password" id="password" name="password"/> </div> <div> <label for="email">メールアドレス</label> <input type="email" id="email" name="email"/> </div> <input type="submit" value="登録"/> </form> </body> </html>
回答3件
あなたの回答
tips
プレビュー