1

データベースに挿入する必要がある大きなフォームがいくつかあります。

現在こんな感じでやってます

$stmt = $memberMysqli->prepare("INSERT INTO questionnairebespokeexerciseplan(userid,date,naturalbodytype,framesizewrist,framesizeelbow,fitnessgoals,workpattern,sleephours,runningbarriers,workcommute,workdistance,smoke,biomechanicalissues,limitingillness,reletivesheartproblems,birthlast12months,recurringinjuries,regularmedication,pregnant,anythingelsehealth,gymmember,runoutdoors,wouldyouliketorunoutdoors,homeequipments,whattypeequipment,exercisetime,heartratemonitor,restingheartrate,actualheartrate,maxheartrate,heartratesteadyrun,heartratebreathless,trainingshoes,preferredexercisetype,exerciseclasses,classdays,bike,bikemodel,runlunchtimebeforework,clubmember,clubschedule,personaltraining,otherheartrate,foottype) VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)");

$stmt->bind_param('ssssssssssssssssssssssssssssssssssssssssssss',
                                                $_POST['userid'],
                                        $date,
                                        $_POST['naturalbodytype'],
                                        $_POST['framesizewrist'],
                                        $_POST['framesizeelbow'],
                                        $_POST['fitnessgoals'],
                                        $_POST['workpattern'],
                                        $_POST['sleep'],
                                        $_POST['runbarriers'],
                                        $_POST['workcommute'],
                                        $_POST['workmiles'],
                                        $_POST['smoke'],
                                        $_POST['biomechanical'],
                                        $_POST['illnesses'],
                                        $_POST['heartcondition'],
                                        $_POST['givenbirth'],
                                        $_POST['injuries'],
                                        $_POST['medication'],
                                        $_POST['pregnant'],
                                        $_POST['anythingelse'],
                                        $_POST['gymmember'],
                                        $_POST['runoutdoors'],
                                        $_POST['liketorunoutside'],
                                        $_POST['homeequipment'],
                                        $_POST['equipment'],
                                        $_POST['besttime'],
                                        $_POST['heartratemonitor'],
                                        $_POST['restingheartrate'],
                                        $_POST['actualheartrate'],
                                        $_POST['actualmaxheartrate'],
                                        $_POST['heartratesteadyrun'],
                                        $_POST['heartratebreathless'],
                                        $_POST['trainingshoes'],
                                        $_POST['preferredexersize'],
                                        $_POST['classes'],
                                        $_POST['classdays'],
                                        $_POST['bike'],
                                        $_POST['whatbike'],
                                        $_POST['beforeworklunchtime'],
                                        $_POST['clubmember'],
                                        $_POST['clubschedule'],
                                        $_POST['personaltrainer'],
                                        $_POST['otherheartrate'],
                                        $_POST['foottype']
                                        );

これを行うためのより良い/より速い方法があるかどうかを考えていましたか?

現在、これを作成するには少し時間がかかり、正しくない場合のデバッグにも同様に時間がかかります。

4

2 に答える 2

1

このステートメントの生成を自動化するスクリプトを自分で作成できます。(フォームと DB で)フィールド名の一貫性を保つようにしてください。

// ADD ALL YOUR FIELDS TO THIS ARRAY. 
// THIS SHOULD BE THE ONLY PART OF THE CODE 
// WHICH YOU WILL HAVE TO MAINTAIN.

$fields = array(
'userid',
'date',
'naturalbodytype',
'framesizewrist' //etc. add all your fields
);

//you may have to adjust some fields manually:

$_POST['date'] = $date;


//HERE IS WHERE THE AUTOMATED PART STARTS
//YOU WONT EVER HAVE TO TOUCH THIS PART

//writing all fields for the query
$all_fields = implode(', ' $fields); 

//writing the correct number of questionmarks    
$questionmarks = str_repeat('?, ' count($fields)-1).'?';

//generate your statement
$stmt = $memberMysqli->prepare(
"INSERT INTO questionnairebespokeexerciseplan
 ( {$all_fields} ) 
 VALUES 
 ( {$questionmarks} )");

//write the correct amount of 's' characters for parameter types
$parameter_types = str_repeat('s' count($fields));


//generate the code which will write the parameters

$all_fields_to_bind=array();

foreach($fields as $field)
{
    $all_fields_to_bind[] = "\$_POST['". $field. "']";
}

//generate the code to be evaluated
$eval_statement = '$stmt->bind_param($parameter_types,'.implode(', ', $all_fields_to_bind).');';

//evaluate (meaning execute) your dynamically generated code
eval($eval_statement);

私はこれをテストしていません。構文エラーがまだあるかもしれません。また、それがどれほど安全かはわかりません!しかし、私は SELECT ステートメントに似たものを使用しているので、うまくいくはずです。

于 2013-03-25T18:46:50.833 に答える
-1

SafeMysqlはコードを 3 分の 1 に短縮できます。ただし、許可されているすべてのフィールドをリストすることは不可欠です。

$allowed = explode(",","userid,date,naturalbodytype,framesizewrist,framesizeelbow,fitnessgoals,workpattern,sleephours,runningbarriers,workcommute,workdistance,smoke,biomechanicalissues,limitingillness,reletivesheartproblems,birthlast12months,recurringinjuries,regularmedication,pregnant,anythingelsehealth,gymmember,runoutdoors,wouldyouliketorunoutdoors,homeequipments,whattypeequipment,exercisetime,heartratemonitor,restingheartrate,actualheartrate,maxheartrate,heartratesteadyrun,heartratebreathless,trainingshoes,preferredexercisetype,exerciseclasses,classdays,bike,bikemodel,runlunchtimebeforework,clubmember,clubschedule,personaltraining,otherheartrate,foottype");

$data = $db->filterArray($_POST,$allowed);
$sql = "INSERT INTO questionnairebespokeexerciseplan SET ?u";
$db->query($sql, $data);
于 2013-03-25T19:30:06.903 に答える