Gérer les champs vides dans un formulaire de saisie avec l’objet PHP PDO et postgresql

la programmation


J’ai un formulaire dans lequel j’attends de nombreuses zones de texte de saisie vides (html standard)
Je dois insérer des enregistrements, l’instruction INSERT ignorant les champs qui n’ont pas de valeurs d’entrée. Pour le contexte, je prends les variables POST de la manière habituelle :

if ($_SERVER['REQUEST_METHOD']=="POST") {
        //$well_no = $_POST['well_no'];
        $easting = $_POST['easting'];
        $northing = $_POST['northing'];

etc etc pour 15 variables. $well_no n’est pas une variable POST, mais calculée à partir de 2 autres variables POST :

$well_no = $date_completed."-".substr($country,0,2)."-".mt_rand(1,9).mt_rand(10,50);

Ce que j’ai essayé :

J’ai essayé l’approche suivante:

<pre>$fields = [ 'easting', 'northing', 'purpose', 'country', 'admin1', 'admin2', 'admin3', 'settlement',
	'orig_wellno', 'date_completed', 'coord_sys', 'elev', 'status'];

$col = []; // array of columns
$input = []; // array of prepared query input values

// add the well no
$input[] = $well_no; // my computed (not POST) variable
$col = ["`well_no`"];

        
        // loop to get array of field names and values for each
foreach($fields as $field)
{
	// note: empty considers 0 or '0' to be an empty value. this will prohibit a numerical zero value being used.
	//  instead test if the value is or is not an empty string.
	if($_POST[$field] !== '')
	{
		$col[] = "`$field`";
		$input[] = $_POST[$field];
	}
} 


        try {
            
            sql = "INSERT INTO well_parent (".implode(',',$col).") VALUES (".implode(',',array_fill(0,count($col),implode(',', $input))).")";
            $stmnt = $pdo->prepare($sql);
            $user_data = [':well_no'=>$well_no, ':easting'=>$easting, ':northing'=>$northing, ':purpose'=>$purpose,  ':country'=>$country, 
            ':admin1'=>$admin1, ':admin2'=> $admin2, ':admin3'=>$admin3, ':settlement'=>$settlement, ':orig_wellno'=>$orig_wellno, 
            ':date_completed'=> $date_completed, ':coord_sys'=> $coord_sys, ':elev'=>$elev, ':status'=>$status];
            
	echo '<pre>'; print_r($user_data); echo '

‘;

écho $sql;

$stmnt->execute($user_data);

Voici ma sortie lorsque j’imprime _r le tableau $user_data :

Array
(
    [:well_no] => 2017-05-09-Ug-922
    [:easting] => 
    [:northing] => 
    [:purpose] => production
    [:country] => Uganda
    [:admin1] => mbale
    [:admin2] => nomu
    [:admin3] => booboo
    [:settlement] => lop
    [:orig_wellno] => bh1
    [:date_completed] => 2017-05-09
    [:coord_sys] => 
    [:elev] => 200
    [:status] => 1
)

Le tableau $user-data semble donc bon. Je fais également écho à la déclaration SQL :

INSERT INTO well_parent (`well_no`,`purpose`,`country`,`admin1`,`admin2`,`admin3`,`settlement`,`orig_wellno`,`date_completed`,`elev`,`status`) VALUES (2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1,2017-05-09-Ug-538,production,Uganda,mbale,nomu,booboo,lop,bh1,2017-05-09,200,1)Error: SQLSTATE[HY093]: Invalid parameter number: :well_no

J’obtiens les valeurs correctes dans la clause valeurs, mais répétées 11 fois ! (Remarquez l’avertissement, je crois que l’erreur SQL mentionne :well_no car c’est le premier paramètre problématique qu’elle rencontre. Je sais que le problème réside dans la fonction array_fill et dans l’utilisation de impode() comme paramètre de valeurs, mais je ne sais pas comment répare ça

Solution 1

Ton array_fill() est le coupable. Regarde ce que tu mets après VALUES (

implode(',',array_fill(0,count($col),implode(',', $input)))

Il est effectivement évalué de droite à gauche en raison des appels de fonction imbriqués, alors prenez le premier (le plus à droite) implode(). Cela enchaînera les $input[] tableau, comme vous l’avez fait pour $col[] plus tôt.
C’est assez!
array_fill() puis le réplique autant de fois que vous avez de champs.

Alors, traitez $input[] exactement comme tu l’as fait $col[]

コメント

タイトルとURLをコピーしました