[RESOLU] mysqli > pdo ?

Eléphant du PHP | 363 Messages

11 août 2015, 15:32

Kikoo,

Je voulais savoir si mysqli était mieux que PDO et empêchait aussi les injections sql ?

Fée
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

11 août 2015, 16:25

Bonjour,

Ce qui permet d'éviter le + efficacement les injections SQL ce sont les requêtes préparées, que tu le fasses avec MySQLi ou PDO ne change rien :
http://php.net/manual/fr/pdo.prepare.php
http://php.net/manual/fr/mysqli.prepare.php
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 363 Messages

11 août 2015, 23:34

Ah d'accord merci mais c'est quoi le mieux, la différence, etc ?

Tu utilises quoi toi ?

Bonne soirée ou nuit :)
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

ViPHP
ViPHP | 928 Messages

12 août 2015, 00:07

Les deux permettent la même chose, mais j'ai une préférence pour PDO qui est un peu plus complet, mieux documenté sur le web et permet aussi le multi plateforme dans une certaine mesure.

Eléphant du PHP | 363 Messages

14 août 2015, 10:12

Merci pour le tuyau :)

sur mysqli entre le mode objet et mode procédural, y'a une différence ou là encore c'est une question de feeling ^^

Sinon je ne vois pas comment on passe de
if ($stmt = $mysqli->prepare("SELECT District FROM City WHERE Name=?")) {
à
/* Lecture des marqueurs */
    $stmt->bind_param("s", $city);
Comment il sait faire le rapprochement alors que Name est même pas rappelé ?
Il faut remplacer le "?" ou laisser comme ça ? Y'a un truc qui m'échappe :?
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Mammouth du PHP | 1029 Messages

14 août 2015, 14:11

Bonjour,

En fait tu dois passer les paramètres dans l'ordre où tu les appels dans ton select.

Le premier bind correspond au premier ?

Le 's' dit que tu lui passe une string.

http://php.net/manual/fr/mysqli-stmt.bind-param.php
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 363 Messages

18 août 2015, 12:42

Ok, merci beaucoup maitrepylos.

Tu aurais un exemple de connexion select affichage en PDO avec des requêtes préparées et des marqueurs nommés ? le b a ba pour la newbie que je suis :)
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Mammouth du PHP | 1029 Messages

18 août 2015, 14:39

En plus du Net, tu trouveras ce dont tu as besoin sur le site de PHP http://php.net/manual/fr/book.pdo.php
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 363 Messages

18 août 2015, 16:16

reKikoo,

Puis-je avoir votre avis, conseils pour savoir si je pars juste dans la bonne direction, si j'ai pas oublié des choses...

J'ai créé en local ce fichier login.php
<?php 
define('DSN', 'mysql:host=localhost;dbname=foetus69;port=3306');
define('LOGIN', 'root');
define('MOT_DE_PASSE', '');
$options = array();
?>
et dans ma page de traitement.php j'ai fait ceci :
<?php
require_once('login.php'); // appel des paramètres de connexion
$dbh = new PDO(DSN, LOGIN, MOT_DE_PASSE, $options); // on se connecte

$var = 10;

$sql = 'SELECT id, nom, prenom from patients WHERE id = :idprepare'; //mon select avec mon marqueur nommé

$sth = $dbh->prepare($sql, array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY));// c'est quoi cette ligne ?
$sth->execute(array(':idprepare' => $var)); //on affecte et remplace la valeur

echo $sth->rowCount(); //je compte le nombre d'enregistrements à priori 1 ou 0

while($data=$sth->fetch()){ //je fais une affectation pour affichage
    echo "bonjour ".$data['prenom']." ".$data['nom'];
}
?>
Ca semble marcher après, est-ce la bonne façon de faire..? Est-ce sécurisé ? Propre ? Complet ?

Merci pour votre œil aguéri.

La petite fée
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

Mammouth du PHP | 1029 Messages

18 août 2015, 16:21

Cela me semble correcte, maintenant si tu es sur que cela retourne max 1 lignes, alors le while n'est pas nécessaire.
L'expérience est la somme de toutes nos erreurs.

Eléphant du PHP | 363 Messages

18 août 2015, 16:38

D'accord, MERCI pour l'échange.

Il me manque peut être la fermeture avec closeCursor(); apparemment ?
Ca sert à quoi array(PDO::ATTR_CURSOR => PDO::CURSOR_FWDONLY), c'est obligatoire ?
Pour le nombre de lignes dans ce cas précis tu as raison :)
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?

ViPHP
xTG
ViPHP | 7331 Messages

19 août 2015, 10:05

Cela veut dire à priori que tu ne pourras pas revenir en arrière dans les enregistrements.
Ce n'est pas une liste doublement chaînée en gros. Tu te déplaces du premier enregistrement vers le dernier mais ne pourra pas faire l'inverse.
PDO::ATTR_CURSOR (integer)
Selects the cursor type. PDO currently supports either PDO::CURSOR_FWDONLY and PDO::CURSOR_SCROLL. Stick with PDO::CURSOR_FWDONLY unless you know that you need a scrollable cursor.

PDO::CURSOR_FWDONLY (integer)
Create a PDOStatement object with a forward-only cursor. This is the default cursor choice, as it is the fastest and most common data access pattern in PHP.

PDO::CURSOR_SCROLL (integer)
Create a PDOStatement object with a scrollable cursor. Pass the PDO::FETCH_ORI_* constants to control the rows fetched from the result set.

Eléphant du PHP | 363 Messages

20 août 2015, 09:29

Bonjour,

Ok ^^, ça parait plutôt limitatif, non ?

En tout cas j'ai ma réponse à ma question initiale, merki !!!

Encore une victoire pour php france (je sais je regarde trop la pub :lol:)
Dis-donc fossoyeur, t'as une dent contre moi ou quoi ?