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

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

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

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

Q&A

解決済

3回答

2025閲覧

Insert into で、DBにデータ登録が出来ません。

YukaSaku

総合スコア52

INSERT

INSERTとは、行を追加する、コンピュータのデータベース言語SQLにおけるデータ操作言語(DML)ステートメントの1つである

MySQL

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

0グッド

0クリップ

投稿2017/04/28 19:05

編集2017/04/28 19:32

以下のプログラムを実行して、データをDBに追加したいのですが、Couldn't Excute Query、クエリーが実行できませんといわれます。
なぜでしょうか?

php

1<?php 2/* Program name: checkBlankOnly_2.php 3 * Description: Program displays the blank form and checks 4 * all the form fields for blank fields. 5 */ 6ini_set("display_errors","on"); 7error_reporting(E_ALL | E_STRICT); 8ini_set("include_path","./includes"); 9include("dbinfo.inc"); 10 11 12 13if(isset($_POST['submitted']) and $_POST['submitted'] == "yes") 14{ 15 foreach($_POST as $field => $value) 16 { 17 if(empty($value)) 18 { 19 if($field != "middle_name") 20 { 21 $blank_data[] = $field; 22 } 23 } 24 else 25 { 26 $good_data[$field] = strip_tags(trim($value)); 27 } 28 } 29 if(@sizeof($blank_data) > 0) 30 { 31 $message = "<p style='color: red; margin-bottom: 0; 32 font-weight: bold'> 33 You didn't fill in one or more required fields. 34 You must enter: 35 <ul style='color: red; margin-top: 0; 36 list-style: none' >"; 37 /* display list of missing information */ 38 foreach($blank_data as $value) 39 { 40 $message .= "<li>$value</li>"; 41 } 42 $message .= "</ul>"; 43 echo $message; 44 extract($good_data); 45 include("form_test3.inc"); 46 exit(); 47 } 48 foreach($_POST as $field => $value) 49 { 50 if(!empty($value)) 51 { 52 $name_patt = "/^[A-Za-z' -]{1,50}$/"; 53 $phone_patt = "/^[0-9)(xX -]{7,20}$/"; 54 $radio_patt = "/(new|changed)/"; 55 if(preg_match("/name/i",$field)) 56 { 57 if(!preg_match($name_patt,$value)) 58 { 59 $error_array[] = "$value is not a valid name"; 60 } 61 } 62 if(preg_match("/phone/i",$field)) 63 { 64 if(!preg_match($phone_patt,$value)) 65 { 66 $error_array[] = "$value is not a valid phone number"; 67 } 68 } // endif phone format check 69 if(preg_match("/status/i",$field)) 70 { 71 if(!preg_match($radio_patt,$value)) 72 { 73 $error_array[] = "$value is not a valid status"; 74 } 75 } 76 } 77 $clean_data = NULL; 78 $sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 79 VALUES ('$clean_data[last_name]','$clean_data[first_name]', 80 '$clean_data[middle_name]','$clean_data[phone]')"; 81 } 82 if(@sizeof($error_array) > 0) 83 { 84 $message = "<ul style='color: red; list-style: none' >"; 85 foreach($error_array as $value) 86 { 87 $message .= "<li>$value</li>"; 88 } 89 $message .= "</ul>"; 90 echo $message; 91 extract($clean_data); 92 include("form_test3.inc"); 93 exit(); 94 } 95 else 96 { 97 $cxn = mysqli_connect($host,$user,$passwd,$dbname) 98 or die("Couldn't connect to server"); 99foreach((array)$clean_data as $field => $value) 100{ 101 $clean_data[$field] = mysqli_real_escape_string($cxn,$value); 102} 103$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 104 VALUES ('$clean_data[last_name]','$clean_data[first_name]', 105 '$clean_data[middle_name]','$clean_data[phone]')"; 106$result = mysqli_query($cxn,$sql) 107 or die("Couldn't execute query"); 108include("stored.inc"); 109 } 110} 111else 112{ 113 include("form_test3.inc"); 114} 115?>

私は、この部分↓

php

1$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 2 VALUES ('$clean_data[last_name]','$clean_data[first_name]', 3 '$clean_data[middle_name]','$clean_data[phone]')";

の鍵括弧がいけないんじゃないかなと思ってるんです。なぜなら、DBから直接SQL構文を使ってデータを入れる時は鍵括弧ではデータは入らず、ダブルコーテーションなら入るからです。でもこのプログラム上でダブルコーテーションにすると構文エラーになります。

構文自体が間違ってるとは思うし、なぜこの構文が2回出てくるのかもよくわかってません。

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

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

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

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

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

guest

回答3

0

実行しようとしている$sqlとやらが正しいかどうか、echoなどで表示させて確認してみるといい。
そのSQLが直接コマンドラインで実行できるのかどうか。

でも、セキュリティ等の観点からプレースホルダを使うなどの書き方に変えるとかを検討したほうがいい。

安全なSQLの呼び出し方 - IPA

投稿2017/04/28 22:24

tomomo

総合スコア430

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

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

YukaSaku

2017/05/01 15:22

echoを入れても何も出てこなかったので、プログラム自体がおかしいんだと思います。 もう少し整理できたら、やってみようと思います。 ありがとうございます。
guest

0

ベストアンサー

セキュリティの面から変えるのがよろしいかとおもいますが、とりあえすです。

php

1$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 2 VALUES ('".$clean_data['last_name']."','".$clean_data['first_name']."', 3 '".$clean_data['middle_name']."','".$clean_data['phone']."')";

実行できませんが、想像して作成してみました。

php

1<?php 2/* Program name: checkBlankOnly_2.php 3 * Description: Program displays the blank form and checks 4 * all the form fields for blank fields. 5 */ 6ini_set("display_errors","on"); 7error_reporting(E_ALL | E_STRICT); 8ini_set("include_path","./includes"); 9include("dbinfo.inc"); 10 11if(isset($_POST['submitted']) and $_POST['submitted'] == "yes") 12{ 13 foreach($_POST as $field => $value) 14 { 15 if(empty($value)) 16 { 17 if($field != "middle_name") 18 { 19 $blank_data[] = $field; 20 } 21 } 22 else 23 { 24 $good_data[$field] = strip_tags(trim($value)); 25 } 26 } 27 if(@sizeof($blank_data) > 0) 28 { 29 $message = "<p style='color: red; margin-bottom: 0; 30 font-weight: bold'> 31 You didn't fill in one or more required fields. 32 You must enter: 33 <ul style='color: red; margin-top: 0; 34 list-style: none' >"; 35 /* display list of missing information */ 36 foreach($blank_data as $value) 37 { 38 $message .= "<li>$value</li>"; 39 } 40 $message .= "</ul>"; 41 echo $message; 42 extract($good_data); 43 include("form_test3.inc"); 44 exit(); 45 } 46 foreach($_POST as $field => $value) 47 { 48 if(!empty($value)) 49 { 50 $name_patt = "/^[A-Za-z' -]{1,50}$/"; 51 $phone_patt = "/^[0-9)(xX -]{7,20}$/"; 52 $radio_patt = "/(new|changed)/"; 53 if(preg_match("/name/i",$field)) 54 { 55 if(!preg_match($name_patt,$value)) 56 { 57 $error_array[] = "$value is not a valid name"; 58 } 59 } 60 if(preg_match("/phone/i",$field)) 61 { 62 if(!preg_match($phone_patt,$value)) 63 { 64 $error_array[] = "$value is not a valid phone number"; 65 } 66 } // endif phone format check 67 if(preg_match("/status/i",$field)) 68 { 69 if(!preg_match($radio_patt,$value)) 70 { 71 $error_array[] = "$value is not a valid status"; 72 } 73 } 74 } 75 //$clean_data = NULL; 76 //$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 77 //VALUES ('$clean_data[last_name]','$clean_data[first_name]', 78 // '$clean_data[middle_name]','$clean_data[phone]')"; 79 } 80 if(@sizeof($error_array) > 0) 81 { 82 $message = "<ul style='color: red; list-style: none' >"; 83 foreach($error_array as $value) 84 { 85 $message .= "<li>$value</li>"; 86 } 87 $message .= "</ul>"; 88 echo $message; 89 extract($clean_data); 90 include("form_test3.inc"); 91 exit(); 92 } 93 else 94 { 95 $cxn = mysqli_connect($host,$user,$passwd,$dbname) 96 or die("Couldn't connect to server"); 97 //foreach((array)$clean_data as $field => $value) 98 $clean_data = array(); 99 foreach($_POST as $field => $value) 100 { 101 $clean_data[$field] = mysqli_real_escape_string($cxn,$value); 102 } 103 //$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 104 //VALUES ('$clean_data[last_name]','$clean_data[first_name]', 105 // '$clean_data[middle_name]','$clean_data[phone]')"; 106 $sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) VALUES ('" 107 .$clean_data['last_name']."','".$clean_data['first_name']."','" 108 .$clean_data['middle_name']."','".$clean_data['phone']."')"; 109 110 $result = mysqli_query($cxn,$sql) 111 or die("Couldn't execute query"); 112 include("stored.inc"); 113 } 114} 115else 116{ 117 include("form_test3.inc"); 118} 119?>

投稿2017/04/29 01:37

編集2017/05/02 00:37
A.Ichi

総合スコア4070

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

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

YukaSaku

2017/05/01 15:13

Ichiさんに教えていただいたコードを入れてみたところ、次のエラーが出てきて Warning: Invalid argument supplied for foreach() in /home/vol14_5/ihostfull.com/uoolo_19138640/htdocs/PHP/Ex5/checkBlankOnly_2.php on line 99 Couldn't execute query と表示され、つまりこのLine99というのは以下の部分なんです。 foreach($clean_data as $field => $value) { $clean_data[$field] = mysqli_real_escape_string($cxn,$value); } $clean_dataが何なのか、自分でもよくわかってなく、教科書は、なんでここに$clean_dataを使いたいのか、よくわからずにいるので、今は飛ばそうと思います。 ありがとうございました。
YukaSaku

2017/05/02 14:12

Ichiさん、追加でコードを書いていただきまして、ありがとうございます。朝から晩まで1週間、このコードだけに悩まされてたので涙が出そうです。エラーも出ずに、きちんとDBに入力データが送られてました!!!!!本当に感謝します。ありがとうございます!!!
guest

0

正解です。

sql

1$sql = "INSERT INTO CustomerPhone (last_name,first_name,middle_name,phone) 2 VALUES ('"$clean_data[last_name]"','"$clean_data[first_name]"', 3 '"$clean_data[middle_name]"','"$clean_data[phone]"')";

カギカッコは""の外に出しましょう。

投稿2017/04/29 00:17

maiko0318

総合スコア876

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

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

YukaSaku

2017/05/01 15:14

ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問