Protection de l'insertion SQL du file CSV à partir de l'injection SQL

Je convertis mon code pour le protéger de l'injection SQL.

Actuellement, j'ai converti la plus grande partie de mon code et je l'ai fait fonctionner mais j'ai deux requêtes dont je suis un peu confus. Je travaille à partir des docs php ici

L'exemple 4 est la situation que je pense devoir utiliser. Mais je ne comprends pas comment cela va avoir la valeur dont j'ai besoin dans ma déclaration préparée.

La première déclaration que je dois changer est,

require_once('Dbconfig.php'); $limit = (intval($_GET['limit']) != 0) ? $_GET['limit'] : 5; $offset = (intval($_GET['offset']) != 0) ? $_GET['offset'] : 0; $sql = "SELECT * FROM wuno_inventory WHERE 1 ORDER BY id ASC LIMIT $limit OFFSET $offset"; try { $stmt = $DB_con->prepare($sql); $stmt->execute(); $results = $stmt->fetchAll(); } catch (Exception $ex) { echo $ex->getMessage(); } if (count($results) > 0) { foreach ($results as $res) { echo '<tr class="invent">'; echo '<td>' . $res['wuno_product'] . '</td>'; echo '<td>' . $res['wuno_alternates'] . '</td>'; echo '<td>' . $res['wuno_description'] . '</td>'; echo '<td>' . $res['wuno_onhand'] . '</td>'; echo '<td>' . $res['wuno_condition'] . '</td>'; echo '</tr>'; } } ?> 

Et la deuxième déclaration que j'ai besoin de convertir est,

 <?php require_once ('Dbconfig.php'); $limit = (intval($_GET['limit']) != 0 ) ? $_GET['limit'] : 5; $offset = (intval($_GET['offset']) != 0 ) ? $_GET['offset'] : 0; if(!empty($_POST["itemID"])) { $sql=" SELECT * FROM wuno_inventory WHERE wuno_product like '%". $_POST["itemID"] ."%' OR wuno_alternates like '%". $_POST["itemID"] ."%' ORDER BY wuno_product ASC LIMIT $limit OFFSET $offset "; try { $stmt = $DB_con->prepare($sql); $stmt->execute(); $results = $stmt->fetchAll(); } catch (Exception $ex) { echo $ex->getMessage(); } if (count($results) > 0) { foreach ($results as $res) { echo '<tr class="invent">'; echo '<td>' . $res['wuno_product'] . '</td>'; echo '<td>' . $res['wuno_alternates'] . '</td>'; echo '<td>' . $res['wuno_description'] . '</td>'; echo '<td>' . $res['wuno_onhand'] . '</td>'; echo '<td>' . $res['wuno_condition'] . '</td>'; echo '</tr>'; } } } ?> 

C'est l'exemple que j'essayais d'utiliser,

 <?php $stmt = $dbh->prepare("SELECT * FROM REGISTRY where name = ?"); if ($stmt->execute(array($_GET['name']))) { while ($row = $stmt->fetch()) { print_r($row); } } ?> 

Je ne comprends pas comment et pourquoi append un ? dans la déclaration fonctionne. Est-ce vraiment en train de me dire que tout ce que je dois faire est d'append un ? où sont mes deux noms de colonnes? S'il vous plaît montrez-moi comment convertir ces deux instructions en instructions préparées pour éviter l'injection SQL.

La bibliothèque d'instructions préparée prend soin de s'assurer que datatables inputs dans les colonnes sont "sécurisées", empêchant ainsi l'injection SQL.

Voici comment utiliser l'espace réservé ( ? ) Dans l'un de vos exemples de code en tant qu'instruction préparée:

 if(!empty($_POST["itemID"])) { $sql=" SELECT * FROM wuno_inventory WHERE wuno_product like ? OR wuno_alternates like ? ORDER BY wuno_product ASC LIMIT $limit OFFSET $offset "; try { $stmt = $DB_con->prepare($sql); $stmt->execute(array('%'.$_POST['itemID'].'%','%'.$_POST['itemID'].'%')); // two placeholders in the query means two items in the array $results = $stmt->fetchAll(); } catch (Exception $ex) { echo $ex->getMessage(); } } 

En savoir plus sur Demystifying PDO .

Vous DEVEZ passer toutes les valeurs à lier dans un tableau à PDOStatement->execute() ou vous devez lier chaque valeur avec PDOStatement->bindValue() , puis appeler PDOStatement->execute() sans paramètre. Passer un tableau (vide ou non) à execute() replacea toutes les bindings précédentes et peut conduire à des erreurs, par exemple avec MySQL l'erreur "SQLSTATE [HY000]: Erreur générale: 2031" (CR_PARAMS_NOT_BOUND) si vous avez passé un tableau vide.