2016-10-28 10 views
0

数値を入力するために使用できるHTMLテーブルには数十の入力があります。送信ボタンを押すと、すべての入力値がpostメソッドを介してSQLテーブルの対応する列に追加されます。値<input name="A1>がSQLテーブルの列A1に送信され、<input name="A2>が列A2に送信されます。入力された入力値のみをSQL経由でデータベースに送信

私は現在、私のテーブルにデータを挿入するには、このような何か(ただし、パラメータの数十を持つ)を使用しています。このアプローチの

$sql = "INSERT INTO all_stats_table (A1, A2, A3) VALUES ($A1, $A2, $A3)"; 

問題は、すべての入力が満たされる必要があるか、をもたらすことですSQLエラーです。私は最初、データベースにすべてを送信する前に、すべての空の入力値を0に設定するためにPHPを使用しましたが、私はこの方法が最も効率的な方法だとは思いません。

私はどちらの入力が実際に満たされているかを動的にチェックし、すべての空の入力値を0に変換せずにすべてをデータベースに送信するのではなく、その値をテーブルに送信したいと思っています。

私はすでにSQLですべてのデフォルト値を0に設定していますが、埋め込まれた入力値をSQL経由でのみ送信する方法はわかりません。私はPHPのforeachループを使用してみましたが、私は間違いなく正しいSQL構文を見つけるのが難しいです。

私がしようとしていることは可能ですか?そうでない場合、このプロセスをより効率的にするためのベストプラクティスは何でしょうか?

はあなたの助けをありがとう


EDIT:

HTML::

<input name='name'> 
<input name='address'> 
<input name='age'> 

PHP:

非番SQL列にAkashさんraigadeの優れたソリューションを適合させる
試み
$Field_list = array ('name','address','age'); 

$field_string = ''; 
$input_string = ''; 

foreach ($_POST as $userInfo=>$userInfo_value) { 
    if (isset($userInfo)) { 
     if ($field_string == '') { 
      $field_string = $field_string.$userInfo; //problem here ? 
      $input_string = $userInfo_value; //problem here ? 
     } 
     else { 
      $field_string = $field_string.','.$userInfo; //problem here ? 
      $input_string = $input_string.','.$userInfo_value; //problem here ? 
     } 
    } 
} 
$sql = "INSERT INTO protocole_test (".$field_string.") VALUES (".$input_string.")"; 
echo $sql ; //check query formed 
+0

使用プリペアドステートメントhttp://bobby-tables.com/ – user3284463

答えて

1

[バージョンアップ]

基本的な考え方は、我々はそれがつもりinputタグの名前と値の助けを借りてstored.Thenされるテーブルのカラム名と同じINPUTのNAME属性を保持することです必要な(FILLED)列と値だけを持つSQL文を準備します。

<input name="name" > 
<input name="age" > 
<input name="gender" > 
<input type='submit'> 

<?php 
$field_string =''; 
$input_string=''; 
foreach ($_POST as $userInfo=>$userInfo_value){ 
    if($userInfo_value !=''){ 
     echo $userInfo."->".$userInfo_value; 
     if ($field_string == '') { 
      $field_string = $field_string.$userInfo; 
      $input_string = $userInfo_value; 
     } 
     else { 
      $field_string = $field_string.','.$userInfo; 
      $input_string = $input_string.','.$userInfo_value; 
     } 
    } 
} 
$sql = "INSERT INTO protocole_test (".$field_string.") VALUES (".$input_string.")"; 
echo $sql ; //check query formed 
?> 

は、[元の答え]は以下のコードを見てください:[テスト済み]

sr.no.|name|age|gender 

CODE:

は、与えられた例えばMySQLのテーブル、次の考慮します
<input name='a1' id='input_for_name'> 
<input name='a2' id='input_for_class'> 
<input name='a3' id='input_for_seat.no'> 
. 
. 
<input name='an' id='input_for_n'> 

は今

<?php 

//you must be having field list to be inserted i.e 
//INSERT INTO all_stats_table >>>(A1, A2, A3)<<< VALUES ($A1, $A2, $A3) 
//A1,A2,A3 is field list here 

//so save them into an array. 
$Field_list = array ('A1','A2','A3',.......'An'); 

//Now get which input_field is inputted by : 
$i=0; 
$field_string = ''; 
$input_string = ''; 
for($i<n){ 
if(isset($_POST['a'.$i])){ 

    if ($field_string == ''){ 
     $field_string = $field_string.$Field_list[$i]; 
     $input_string = $_POST['a'.$i]; 

} 
    else { 
    $field_string = $field_string.','.$Field_list[$i]; 
    $input_string = $input_string.','.$_POST['a'$i]; 
}}} 
    $sql = "INSERT INTO (".$field_string.") VALUES (".$input_string.")"; 
//to check query formed 
echo $sql ; 
    ?> 

説明:

我々は、それは我々が入力リスト内のフィールドリストとその値にそのフィールドを追加するフィールドであれば最終的に我々は、SQL文を生成し、入力フィールドが充填されている確認してください。

+0

ありがとうございました!あなたのソリューションは非常にエレガントで、多くのことを教えてくれました!しかし、SQLの番号付き列では完全に機能しますが、列が特定の名前を持つ必要がある場合(異なる種類のデータを格納する場合)は機能しません。私はすべての入力が満たされたときにうまく動作するforループを使ってこのケースにあなたのソリューションを適合させようとしましたが、1つ以上のフィールドが空のときに動作するようにはできません。私は自分の質問を編集して、何を試したのか、どこに問題があるのか​​を示します。もう一度ありがとう – Nora

+0

@ノラ私はそれが働き、たくさんのことを教えてくれてうれしいです!私はあなたの編集を見て、チェックし、解決策を返す –

+0

しかし最後のケースでエコー$ SQLを添付することはできますか?私は何か問題を得るために私のためにもっと役立つでしょう、または$ sqlが何らかのエラーplsエラーのためにエコーしていない場合 –

0

定義されていないか空であるかどうかをチェックし、そうであれば定義してください。

if ((!isset($_POST['A1'])) || (empty($_POST['A1'])){ 
     $A1 = '0'; 
} else { 
     $A1 = $_POST['A1']; 
} 
+0

あなたの答えをいただき、ありがとうございます。 '$ A1 = preg_replace( '/ [^ 0-9] /'、"、$ _POST ['A1'])?:0; '(すべての非数字を削除する空の値を0に設定します)。しかし、この文を各変数ごとにコピー・ペーストしなければなりませんでしたが、より効率的な方法があるかもしれません。私はまだPHP/SQLの初心者であるため、何かが分かりにくいかもしれません。 – Nora

+0

何かうまくいくのですか? –

+0

@ノラどちらのアプローチでも関数に変換することができます。それを熟考しましょう –

0

これをテストすることはできませんし、デバッグが必要な場合もありますが、関数を作成して各入力に対して関数を呼び出すことができます。次のようなものがあります。

function chkinput($input){ 

if ((!isset($_POST[$input])) || (empty($_POST[$input])){ 
    $$input = '0'; 
} else { 
    $$input = $_POST[$input]; 
} 
return $$input; 
} 

// You could potentially loop through the post array 
// but here I just call the function once per input 
chkinput('A1'); 
chkinput('A2'); 
... 
chkinput('A12'); 
+0

ありがとう、あなたのソリューションは間違いなく私は未知の変数名の使用を理解する助けになりました!あなたのコードは入力されたものだけを送信するのではなく、すべての入力値を送信します。私はポスト配列をループすることによってそれを適応させることが可能かどうかを見るでしょう。 – Nora

+0

$$変数は技術的に "変数変数"と呼ばれ、時にはかなり便利です:) –

0

$_POSTアレイをループし、値があるかどうかを確認します。それを変数に連結している場合。このように:

$fields = ""; 
$values = ""; 

foreach($_POST as $key=>$value){ 
    if($value != ''){ 
    if($value != end($_POST)){ 
     $fields .= $key . ", "; 
     $values .= "'" . $value . "', "; 
    }else{ 
     $fields .= $key; 
     $values .= "'" . $value . "'" ; 
    } 
    } 
} 

$sql = INSERT INTO protocole_test ($fields) VALUES ($values) ; 

あなたのSQLは次のようになります。

INSERT INTO protocole_test (A1, A2, A3) VALUES ('A1', 'A2', 'A3') 
関連する問題