Bonjour,

Je fais appel a vous tous pour votre aide. Je suis vraiment débutant en php et je dois être a même de modifier les données d'une base de données avec l'aide de php. Actuellement, j'utilise une procédure stocké avec SQL Server qui celle-ci est bien interprété par php pour l'appel, mais lors de la modification, je crois bien qu'il y a quelque chose qui entre en défaut. De plus, je ne suis pas sûr d'être immunisé contre les injections SQL de la manière dont je m'y prends. J'ai vraiment besoin de votre aide. Voici mon code :

<?php if(isset($_POST["test"]))
{     
        $NewValue = $_POST["noGL" . $_POST["TLZno"]];    
        $TLZ = $_POST["TLZ"];?>
        <script>
        console.log ("test1");
        </script>
    <?php $sql1 = "UpdateGL @CIE ='RAL', @TLZ='$TLZ', @NOGL='$NewValue'";?>
        <script>
        console.log ("test2");
        </script>
<?php        
}
else
    {
        echo "Rien!";
        
    }
?>
                    <button class="btn btn-success btn-sm dropdown-toggle save" name='submit' id='submit' type="submit" value="Enregistrer">
                        <i class="fa fa-floppy-o fa-lg" aria-hidden="true"> Enregistrer</i>
                    </button>
<script>
$(document).ready(function(){
$('.save').click(function(){
$('#GL_form').submit();
});

});
</script>
</div><!-- Fin class pull-left-->
                     <div class="panel panel-primary filterable">
                     <div class="panel-heading">
                     <h1 class="panel-title" style="font-weight:bold;">Liste des numéros de GL</h1>
                     </div><!--Fin class panel-heading-->
                                <div class="table-responsive">
                                    <form id="GL_form" method="post" action="ListeGL.php">
                                    <input type="hidden" id="test" name="test"/>
                                     <table id="employees" class="table table-highlight">
                                     <thead>
             <tr class="filters" id="filters">
             <th style="text-align: center;"># TLZ</th>
             <th style="text-align: left;">Description</th>
             <th style="text-align: center;">D/C</th>
             <th style="text-align: center;"># GL</th>
             <th style="text-align: left;">Nouveau # GL</th>
             </tr>
             </thead>
             <tbody>
                 
<?php
$sql = "ListeGL";
$result = sqlsrv_query($conn, $sql);
$row_count = sqlsrv_num_rows($result);
while ($row = sqlsrv_fetch_array($result, SQLSRV_FETCH_ASSOC))
{
    //print_r( $row ); // debug code
    $couleur='black';
    $font= 'normal';
    $input="a";
    if( strstr($row['HTML_CODE'], "BOLD()")){
        $font= 'bold';
    }
    if( strstr($row['HTML_CODE'], "BG()")){
        $font2= '#D8D8D8';
    }
    if( strstr($row['HTML_CODE'], "INPUT()")){
        $input= 'input';
        $font2= '#transparent';
    }
?>
             <tr>
                 <?php echo "<tr style=\"font-weight:$font; color:$couleur; background-color:$font2;\">"; ?>
                 <td style="text-align: center;"><?php echo ($row['TLZno']); ?></td>
                 <td style="text-align: left;"><?php echo ($row['TlzDescription']); ?></td>
                 <td style="text-align: center;"><?php echo ($row['TlzType']); ?></td>
                 <td style="text-align: center;"><?php echo ($row['noGL']); ?></td>
                 <td style="font-weight: normal; text-align: left; color: #BDBDBD; ">
                     <<?php echo $input . ' name="noGL' . $row['TLZno'] . '"'; ?> type="text" name="new" value="<?php echo ($row['noGL']); ?>" />
                     </td>
             </tr>
<?php    
}
?>
                        </tbody>
                                    </table>
                                    </form>

Modifié par dragonfaster (26 Apr 2017 - 00:57)
salut,

première chose, la ligne avec l'input a deux attributs name du coup c'est bancale.

le but c'est une mise à jour de masse ?
si c'est le cas le plus simple c'est d'utiliser un champ cacher pour la référence (TLZno?) et un champs texte pour la nouvelle valeur (nogl ?)

connais tu la notation tableau dans les inputs html ?
c'est particulièrement adapté a ton cas.


<input type="text" name="noGL[]"  value="<?php echo $row['noGL']; ?>"/>
<input type"hidden" name="TLZno[]" value ="<?=  $row['TLZno'] ?>" />

le fait d'avoir les deux en même temps va fournir des tableaux dans $_POST.
Ces tableaux auront tout les deux les mêmes index donc on peux simplement récupérer les valeur de l'un a partir de l'autre.
C'est aussi un bon cas d'utilisation des requêtes préparées

Exemple de traitement

<?php
if(!empty($_POST['TLZno']) && !empty($_POST['noGL']))
{
  // requête préparée
  $tlzno = null;
  $nogl = null;
  $stmt = sqlsrv_prepare($conn, 'UpdateGL @CIE =\'RAL\', @TLZ=?, @NOGL= ?',
  [[&$tlzno, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING,SQLSRV_SQLTYPE_VARCHAR  ],
  [&$nogl, SQLSRV_PARAM_IN, SQLSRV_PHPTYPE_STRING, SQLSRV_SQLTYPE_VARCHAR  ]]);
// execution de la requête pour chaque élément du tableau
  foreach($_POST['TLZno'] as $i => $tlzno){
    $nogl = $_POST['noGL'][$i];
    $r = sqlsrv_execute($stmt);
    // gestion des erreurs avec $r si besoin
  }
}
?>

A toi de voir pour les types j'ai mis un cas par défaut
la doc
http://php.net/manual/fr/sqlsrv.constants.php
http://php.net/manual/fr/function.sqlsrv-prepare.php

pour aller plus loin, le mieux c'est aussi d'avoir la valeur de départ ou un flag indiquant la modification pour éviter de faire un update sur toute la table Smiley smile

pour ce qui est des injections SQL il y a rien d'indiqué sur la doc. A voir si la gestion de la gestion des requêtes préparées le fait par défaut (comme PDO).
Si ce n'est pas le cas il faut une fonction perso pour t'en prémunir (minimum protection des ' ).

si tu peux utiliser PDO à la place tu auras tous ce qu'il faut pour éviter cela.


@+
Meilleure solution