I've already been through Stack Overflow for answers but questions still hasn't been answered. Here's my issue:
I had 48 $_POST['textarea'] values from a form I wanted to save in a mySQL database through PHP.
Hence the array execute method was having trouble to process due to large number of parameters,
I found help in this post (PHP Mysql PDO number of bound variables does not match number of tokens) which allowed me to 'prepare', 'bindParam', and 'execute': and the first code was already big at that time. But I choose not to be too touchy and accepted the inelegance.
- And here my pain begins: I will have variable number (meaning different number for each user) of $_POST['things'] from now on, and since a loop appeared to possibly configure each variable name (for which to process
htmlspectialchar(),bindParam()), I face this uncommoding problem: I don't know how to generate those different variables names.
Thus I tried the above code, but I face a no-issue situation.
How can I organise the code in order to create as many variables to save in database as my
$nbr_of_domainvariable?And a pedagogical question: I've previously learnt to bind parameters via
execute(aray['param'=>$param... Is bindParam() function doing the same? Thus is-it useful only for a certain number of param?
PS: at the end you'll find the html <form> code (with sensible information removed possibly roughly, but the main structure is here)
public function saveInfos()
{ //Save info from main board into database table user_board_items.
$domain_assig='';
$UM = new UserManager;
if(isset($_SESSION['user_pseudo'])){
$user_id=$UM->getUserId($_SESSION['user_pseudo']);
}
$DB=$this->dbConnect();
$nbr_of_domain=$this->getNumberOfDomains();
//BUILD REQUEST
for($i=1; $i<=$nbr_of_domain;$i++){
if($i<$nbr_of_domain){
$domain_assig .='DM'.$i.'_ST_G=:DM'.$i.'_ST_G,'
.'DM'.$i.'_MT_G=:DM'.$i.'_MT_G,'
.'DM'.$i.'_LT_G=:DM'.$i.'_LT_G,'
.'DM'.$i.'_ST_T=:DM'.$i.'_ST_T,'
.'DM'.$i.'_MT_T=:DM'.$i.'_MT_T,'
.'DM'.$i.'_LT_T=:DM'.$i.'_LT_T,';
}else {
$domain_assig .='DM'.$i.'_ST_G=:DM'.$i.'_ST_G,'
.'DM'.$i.'_MT_G=:DM'.$i.'_MT_G,'
.'DM'.$i.'_LT_G=:DM'.$i.'_LT_G,'
.'DM'.$i.'_ST_T=:DM'.$i.'_ST_T,'
.'DM'.$i.'_MT_T=:DM'.$i.'_MT_T,'
.'DM'.$i.'_LT_T=:DM'.$i.'_LT_T';
}
}
$req = sprintf("UPDATE user_board_items SET %s WHERE user_id=:user_id",$domain_assig);
//PREPARING REQUEST
$saveRequest = $DB->prepare($req);
//PROTECTING PARAMETERS BEFORE BOUNDING
for($i=1; $i<=$nbr_of_domain;$i++){
$saveRequest->bindParam(':DM'.$i.'_ST_G',htmlspecialchars($_POST['DM'.$i.'_ST_G']));
$saveRequest->bindParam(':DM'.$i.'_MT_G',htmlspecialchars($_POST['DM'.$i.'_MT_G']));
$saveRequest->bindParam(':DM'.$i.'_LT_G',htmlspecialchars($_POST['DM'.$i.'_LT_G']));
$saveRequest->bindParam(':DM'.$i.'_ST_T',htmlspecialchars($_POST['DM'.$i.'_ST_T']));
$saveRequest->bindParam(':DM'.$i.'_MT_T',htmlspecialchars($_POST['DM'.$i.'_MT_T']));
$saveRequest->bindParam(':DM'.$i.'_LT_T',htmlspecialchars($_POST['DM'.$i.'_LT_T']));
}
$saveRequest->bindParam(':user_id',$user_id);
$saveRequest->execute();
$saveRequest->closeCursor();
}
And for the bravest here is my old working but rigid code version that did not admit variations of variables number ( so procedural! :):
public function saveInfos()
{ //Save info from main borad into database table user_board_items
//ini_set('memory_limit', '1024M'); // or you could use 1G
$UM = new UserManager;
if(isset($_SESSION['user_pseudo'])){
$user_id=$UM->getUserId($_SESSION['user_pseudo']);
}
$DB=$this->dbConnect();
$req = "UPDATE
user_board_items
SET
DM1_ST_G=:DM1_ST_G,
DM1_MT_G=:DM1_MT_G,
DM1_LT_G=:DM1_LT_G,
DM1_ST_T=:DM1_ST_T,
DM1_MT_T=:DM1_MT_T,
DM1_LT_T=:DM1_LT_T,
DM2_ST_G=:DM2_ST_G,
DM2_MT_G=:DM2_MT_G,
DM2_LT_G=:DM2_LT_G,
DM2_ST_T=:DM2_ST_T,
DM2_MT_T=:DM2_MT_T,
DM2_LT_T=:DM2_LT_T,
DM3_ST_G=:DM3_ST_G,
DM3_MT_G=:DM3_MT_G,
DM3_LT_G=:DM3_LT_G,
DM3_ST_T=:DM3_ST_T,
DM3_MT_T=:DM3_MT_T,
DM3_LT_T=:DM3_LT_T,
DM4_ST_G=:DM4_ST_G,
DM4_MT_G=:DM4_MT_G,
DM4_LT_G=:DM4_LT_G,
DM4_ST_T=:DM4_ST_T,
DM4_MT_T=:DM4_MT_T,
DM4_LT_T=:DM4_LT_T,
DM5_ST_G=:DM5_ST_G,
DM5_MT_G=:DM5_MT_G,
DM5_LT_G=:DM5_LT_G,
DM5_ST_T=:DM5_ST_T,
DM5_MT_T=:DM5_MT_T,
DM5_LT_T=:DM5_LT_T,
DM6_ST_G=:DM6_ST_G,
DM6_MT_G=:DM6_MT_G,
DM6_LT_G=:DM6_LT_G,
DM6_ST_T=:DM6_ST_T,
DM6_MT_T=:DM6_MT_T,
DM6_LT_T=:DM6_LT_T,
DM7_ST_G=:DM7_ST_G,
DM7_MT_G=:DM7_MT_G,
DM7_LT_G=:DM7_LT_G,
DM7_ST_T=:DM7_ST_T,
DM7_MT_T=:DM7_MT_T,
DM7_LT_T=:DM7_LT_T,
DM8_ST_G=:DM8_ST_G,
DM8_MT_G=:DM8_MT_G,
DM8_LT_G=:DM8_LT_G,
DM8_ST_T=:DM8_ST_T,
DM8_MT_T=:DM8_MT_T,
DM8_LT_T=:DM8_LT_T
WHERE user_id=:user_id";
$saveRequest = $DB->prepare($req);
$DM1_ST_G= htmlspecialchars($_POST['DM1_ST_G']);
$DM1_MT_G= htmlspecialchars($_POST['DM1_MT_G']);
$DM1_LT_G= htmlspecialchars($_POST['DM1_LT_G']);
$DM1_ST_T= htmlspecialchars($_POST['DM1_ST_T']);
$DM1_MT_T= htmlspecialchars($_POST['DM1_MT_T']);
$DM1_LT_T= htmlspecialchars($_POST['DM1_LT_T']);
$DM2_ST_G= htmlspecialchars($_POST['DM2_ST_G']);
$DM2_MT_G= htmlspecialchars($_POST['DM2_MT_G']);
$DM2_LT_G= htmlspecialchars($_POST['DM2_LT_G']);
$DM2_ST_T= htmlspecialchars($_POST['DM2_ST_T']);
$DM2_MT_T= htmlspecialchars($_POST['DM2_MT_T']);
$DM2_LT_T= htmlspecialchars($_POST['DM2_LT_T']);
$DM3_ST_G= htmlspecialchars($_POST['DM3_ST_G']);
$DM3_MT_G= htmlspecialchars($_POST['DM3_MT_G']);
$DM3_LT_G= htmlspecialchars($_POST['DM3_LT_G']);
$DM3_ST_T= htmlspecialchars($_POST['DM3_ST_T']);
$DM3_MT_T= htmlspecialchars($_POST['DM3_MT_T']);
$DM3_LT_T= htmlspecialchars($_POST['DM3_LT_T']);
$DM4_ST_G= htmlspecialchars($_POST['DM4_ST_G']);
$DM4_MT_G= htmlspecialchars($_POST['DM4_MT_G']);
$DM4_LT_G= htmlspecialchars($_POST['DM4_LT_G']);
$DM4_ST_T= htmlspecialchars($_POST['DM4_ST_T']);
$DM4_MT_T= htmlspecialchars($_POST['DM4_MT_T']);
$DM4_LT_T= htmlspecialchars($_POST['DM4_LT_T']);
$DM5_ST_G= htmlspecialchars($_POST['DM5_ST_G']);
$DM5_MT_G= htmlspecialchars($_POST['DM5_MT_G']);
$DM5_LT_G= htmlspecialchars($_POST['DM5_LT_G']);
$DM5_ST_T= htmlspecialchars($_POST['DM5_ST_T']);
$DM5_MT_T= htmlspecialchars($_POST['DM5_MT_T']);
$DM5_LT_T= htmlspecialchars($_POST['DM5_LT_T']);
$DM6_ST_G= htmlspecialchars($_POST['DM6_ST_G']);
$DM6_MT_G= htmlspecialchars($_POST['DM6_MT_G']);
$DM6_LT_G= htmlspecialchars($_POST['DM6_LT_G']);
$DM6_ST_T= htmlspecialchars($_POST['DM6_ST_T']);
$DM6_MT_T= htmlspecialchars($_POST['DM6_MT_T']);
$DM6_LT_T= htmlspecialchars($_POST['DM6_LT_T']);
$DM7_ST_G= htmlspecialchars($_POST['DM7_ST_G']);
$DM7_MT_G= htmlspecialchars($_POST['DM7_MT_G']);
$DM7_LT_G= htmlspecialchars($_POST['DM7_LT_G']);
$DM7_ST_T= htmlspecialchars($_POST['DM7_ST_T']);
$DM7_MT_T= htmlspecialchars($_POST['DM7_MT_T']);
$DM7_LT_T= htmlspecialchars($_POST['DM7_LT_T']);
$DM8_ST_G= htmlspecialchars($_POST['DM8_ST_G']);
$DM8_MT_G= htmlspecialchars($_POST['DM8_MT_G']);
$DM8_LT_G= htmlspecialchars($_POST['DM8_LT_G']);
$DM8_ST_T= htmlspecialchars($_POST['DM8_ST_T']);
$DM8_MT_T= htmlspecialchars($_POST['DM8_MT_T']);
$DM8_LT_T= htmlspecialchars($_POST['DM8_LT_T']);
$saveRequest->bindParam(':DM1_ST_G',$DM1_ST_G);
$saveRequest->bindParam(':DM1_MT_G',$DM1_MT_G);
$saveRequest->bindParam(':DM1_LT_G',$DM1_LT_G);
$saveRequest->bindParam(':DM1_ST_T',$DM1_ST_T);
$saveRequest->bindParam(':DM1_MT_T',$DM1_MT_T);
$saveRequest->bindParam(':DM1_LT_T',$DM1_LT_T);
$saveRequest->bindParam(':DM2_ST_G',$DM2_ST_G);
$saveRequest->bindParam(':DM2_MT_G',$DM2_MT_G);
$saveRequest->bindParam(':DM2_LT_G',$DM2_LT_G);
$saveRequest->bindParam(':DM2_ST_T',$DM2_ST_T);
$saveRequest->bindParam(':DM2_MT_T',$DM2_MT_T);
$saveRequest->bindParam(':DM2_LT_T',$DM2_LT_T);
$saveRequest->bindParam(':DM3_ST_G',$DM3_ST_G);
$saveRequest->bindParam(':DM3_MT_G',$DM3_MT_G);
$saveRequest->bindParam(':DM3_LT_G',$DM3_LT_G);
$saveRequest->bindParam(':DM3_ST_T',$DM3_ST_T);
$saveRequest->bindParam(':DM3_MT_T',$DM3_MT_T);
$saveRequest->bindParam(':DM3_LT_T',$DM3_LT_T);
$saveRequest->bindParam(':DM4_ST_G',$DM4_ST_G);
$saveRequest->bindParam(':DM4_MT_G',$DM4_MT_G);
$saveRequest->bindParam(':DM4_LT_G',$DM4_LT_G);
$saveRequest->bindParam(':DM4_ST_T',$DM4_ST_T);
$saveRequest->bindParam(':DM4_MT_T',$DM4_MT_T);
$saveRequest->bindParam(':DM4_LT_T',$DM4_LT_T);
$saveRequest->bindParam(':DM5_ST_G',$DM5_ST_G);
$saveRequest->bindParam(':DM5_MT_G',$DM5_MT_G);
$saveRequest->bindParam(':DM5_LT_G',$DM5_LT_G);
$saveRequest->bindParam(':DM5_ST_T',$DM5_ST_T);
$saveRequest->bindParam(':DM5_MT_T',$DM5_MT_T);
$saveRequest->bindParam(':DM5_LT_T',$DM5_LT_T);
$saveRequest->bindParam(':DM6_ST_G',$DM6_ST_G);
$saveRequest->bindParam(':DM6_MT_G',$DM6_MT_G);
$saveRequest->bindParam(':DM6_LT_G',$DM6_LT_G);
$saveRequest->bindParam(':DM6_ST_T',$DM6_ST_T);
$saveRequest->bindParam(':DM6_MT_T',$DM6_MT_T);
$saveRequest->bindParam(':DM6_LT_T',$DM6_LT_T);
$saveRequest->bindParam(':DM7_ST_G',$DM7_ST_G);
$saveRequest->bindParam(':DM7_MT_G',$DM7_MT_G);
$saveRequest->bindParam(':DM7_LT_G',$DM7_LT_G);
$saveRequest->bindParam(':DM7_ST_T',$DM7_ST_T);
$saveRequest->bindParam(':DM7_MT_T',$DM7_MT_T);
$saveRequest->bindParam(':DM7_LT_T',$DM7_LT_T);
$saveRequest->bindParam(':DM8_ST_G',$DM8_ST_G);
$saveRequest->bindParam(':DM8_MT_G',$DM8_MT_G);
$saveRequest->bindParam(':DM8_LT_G',$DM8_LT_G);
$saveRequest->bindParam(':DM8_ST_T',$DM8_ST_T);
$saveRequest->bindParam(':DM8_MT_T',$DM8_MT_T);
$saveRequest->bindParam(':DM8_LT_T',$DM8_LT_T);
$saveRequest->bindParam(':user_id',$user_id);
$saveRequest->execute();
$saveRequest->closeCursor();
}
And the html :
<form id="theForm" enctype="multipart/form-data" action="index.php?action=saveBoardInfo" method="post">
<table>
<thead>
<th class="head_row"> TITLES</th>
<th class="head_row" >SINGULAR SAMPLE PROCESS</th>
<th class="head_row" >FILE</th>
<th class="head_row" >MEDIUM SAMPLE PROCESS</th>
<th class="head_row" >FILE</th>
<th class="head_row" >LARGE SAMPLE PROCESS</th>
<th class="head_row" >FILE</th>
</thead>
<tbody>
<?php
foreach ($names as $number=>$domain) {
?>
<!-- FIRST HALF ROW -->
<tr <?=$number+1?>">
<!-- 2 merged rows-->
<td not_editable" rowspan="2">
<span class="color_category" style="background-color:<?=$color[$number]?>;"></span>
<span ><?=$number + 1 ?></span>
</td>
<!-- Description cell ST-->
<td class="inputContainerTdCell">
<textarea id="<?='DM'.($number+1) .'_'.'ST_G'?>" name="<?='DM'.($number+1) .'_'.'ST_G'?>" class="userInput" value="" placeholder="SINGULAR TEST SAMPLE GENERAL DESCRIPTION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'ST_G'])?></textarea>
</td>
<!-- Description cell MT-->
<td class="inputContainerTdCell">
<textarea id="<?='DM'.($number+1) .'_'.'LT_G'?>" name="<?='DM'.($number+1) .'_'.'MT_G'?>" class="userInput" value="" placeholder="MEDIUM TEST SAMPLE GENERAL DESCRIPTION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'LT_G'])?></textarea>
</td>
<!-- Description cell LT-->
<td class="inputContainerTdCell">
<textarea id="<?='DM'.($number+1) .'_'.'LT_G'?>" name="<?='DM'.($number+1) .'_'.'LT_G'?>" class="userInput" value="" placeholder="LARGE TEST SAMPLE DESCRIPTION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'LT_G'])?></textarea>
</td>
<!-- File import part not mentionned here: 2 merged rows-->
<!-- SECOND HALF ROW -->
<tr>
<td class="inputContainerTdCell userInput">
<textarea id="<?='DM'.($number+1) .'_'.'ST_T'?>" name="<?='DM'.($number+1) .'_'.'ST_T'?>" value="" placeholder="SINGULAR TEST IN PREPARATION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'ST_T'])?></textarea>
</td>
<td class="inputContainerTdCell userInput">
<textarea id="<?='DM'.($number+1) .'_'.'MT_T'?>" name="<?='DM'.($number+1) .'_'.'MT_T'?>" value="" placeholder="MEDIUM TEST IN PREPARATION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'MT_T'])?></textarea>
</td>
<td class="inputContainerTdCell userInput">
<textarea id="<?='DM'.($number+1) .'_'.'LT_T'?>" name="<?='DM'.($number+1) .'_'.'LT_T'?>" value="" placeholder="LARGE TEST IN PREPARATION"><?= htmlspecialchars($board_items['DM'.($number+1) .'_'.'LT_T'])?></textarea>
</td>
</tr>
<!-- SEPARATORS: INVISIBLE SEPARATION ROW -->
<tr style="height:2px;"></tr>
<?php
}
?>
</tbody>
</table>
</form>
<form>