Remplacer msql par pdo
Steph54321
-
Steph54321 -
Steph54321 -
Bonjour,
J'essaie d'adapter mon script de news à PDO. Par exemple, j'ai remplacé :
Par :
Mais j'ai un message d'erreur : "Unsupported operand types" à la ligne 148, la voici :
C'est pour le calcul du nombre de news et sa pagination.
J'essaie d'adapter mon script de news à PDO. Par exemple, j'ai remplacé :
if($archives != 'on') { $req = "select id from ".$prefixe." WHERE valide!='inv'"; } if($archives == 'on') { $req = "select id from ".$prefixe." WHERE valide!='inv' AND date >= '".$datum."'"; } $total = @mysql_num_rows($sql); } else $total = intval($_GET['total']); // on determine debut du limit $debut = ($page - 1) * $nb;
Par :
if($archives != 'on') { $sql = $cnx->query("select id from ".$prefixe." WHERE valide!='inv'"); } if($archives == 'on') { $sql = $cnx->query("select id from ".$prefixe." WHERE valide!='inv' AND date >= '".$datum."'"); } $total = $sql->fetchAll(); } else $total = intval($_GET['total']); // on determine debut du limit $debut = ($page - 1) * $nb;
Mais j'ai un message d'erreur : "Unsupported operand types" à la ligne 148, la voici :
// calcul du nombre de pages $nbpages = ceil($total / $nb); // arrondi a l'entier superieur
C'est pour le calcul du nombre de news et sa pagination.
A voir également:
- Remplacer msql par pdo
- Remplacer disque dur par ssd - Guide
- Remplacer par word - Guide
- Remplacer coco - Accueil - Réseaux sociaux
- Quel site pour remplacer coco - Accueil - Réseaux sociaux
- Remplacer carte graphique - Guide
16 réponses
bonsoir,
les codes que tu donnes ne sont pas clair et ça ne sert pas a grand chose de remplacer les fonctions mysql par pdo si tu n'utilises pas les requêtes préparé
par exemple
c'est un exemple d'utilisation de pdo. il faut toujours préparer ses requêtes, rien que pour éviter les injections sql
les codes que tu donnes ne sont pas clair et ça ne sert pas a grand chose de remplacer les fonctions mysql par pdo si tu n'utilises pas les requêtes préparé
par exemple
$pdo = new PDO(); $req = $pdo->prepare('SELECT ....WHERE id = :variable LIMIT 1'); $req->execute(array('variable' => $id)); $data = $req->fetch(PDO::FETCH_OBJ); $req->closeCursor();
c'est un exemple d'utilisation de pdo. il faut toujours préparer ses requêtes, rien que pour éviter les injections sql
Donc, si j'ai bien compris, une de mes requêtes doit donner ça :
Mais là, j'ai deux messages d'erreur :
Warning: PDO::query() expects parameter 1 to be string, object given in /.../index.php on line 108
Fatal error: Call to a member function rowCount() on a non-object in /.../index.php on line 109
$id = intval($data['id']); $sql2 = $cnx->prepare("SELECT id FROM ".$prefixe."_comments WHERE news='$id'"); $sql2->execute(); $req = $cnx->query($sql2); $res = $req->rowCount();
Mais là, j'ai deux messages d'erreur :
Warning: PDO::query() expects parameter 1 to be string, object given in /.../index.php on line 108
Fatal error: Call to a member function rowCount() on a non-object in /.../index.php on line 109
Merci maka54,
Maintenant, j'ai une autre erreur qui apparaît, mes news ne s'affichent pas :
Warning: Division by zero in /.../index.php on line 150
Maintenant, j'ai une autre erreur qui apparaît, mes news ne s'affichent pas :
Warning: Division by zero in /.../index.php on line 150
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
Warning: Division by zero in /.../index.php on line 150
ligne 150 ??
$nbpages = ceil( count($total) / $nb);
cela veux dire que $nb = 0;
ligne 150 ??
$nbpages = ceil( count($total) / $nb);
cela veux dire que $nb = 0;
il suffit d'ajouter
if($nb == 0) $nb = 1;
avant ta disvision
même si ta page existe tu en as forcément une
if($nb == 0) $nb = 1;
avant ta disvision
même si ta page existe tu en as forcément une
J'ai essayé d'adapter à PDO ces requêtes, mais je n'y arrive pas, ce qui fait que mes news ne s'affichent pas :
if($archives != 'off') { $sql = "SELECT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM ".$prefixe." WHERE valide!='inv' AND date >= '".$datum."' ORDER BY id $ordre LIMIT ".intval($debut).",".intval($nb); } else { $sql = "SELECT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM ".$prefixe." WHERE valide!='inv' ORDER BY id $ordre LIMIT ".intval($debut).",".intval($nb); } // parcours et affichage des résultats if($p = @mysql_query($sql,$c)){ while($data = @mysql_fetch_array($p)){ $sql2 = "SELECT * FROM ".$prefixe."_smileys"; // on envoie la requête $req2 = mysql_query($sql2) or die('Erreur SQL !<br>'.$sql2.'<br>'.mysql_error()); while($resultat = mysql_fetch_array($req2)) { $data['texte'] = str_replace($resultat['code'],'<img src="'.$url.'admin/smileys/'.$resultat['url'].'" style="border:0"/>',$data['texte']); }
J'avais cherché l'équivalent en PDO de mysql_query et mysql_fetch_array. J'avais fait ça :
et
// parcours et affichage des résultats if($p = $cnx->query($sql,$c)){ while($data = $p->fetch(PDO::FETCH_ASSOC));{
et
// on envoie la requête $req2 = $cnx->query($sql2); while($resultat = $req2->fetch(PDO::FETCH_ASSOC)) {
Bonjour
Ça n'a pas l'air si mal que ça. À condition d'enlever le ; en trop :
Ça n'a pas l'air si mal que ça. À condition d'enlever le ; en trop :
while($data = $p->fetch(PDO::FETCH_ASSOC));{
Ah oui, le ; n'était pas à sa place. Pourtant, ça ne marche pas, j'ai une erreur :
Warning: PDO::query() [pdo.query]: SQLSTATE[HY000]: General error: mode must be an integer
Warning: PDO::query() [pdo.query]: SQLSTATE[HY000]: General error: mode must be an integer
Sur quelle ligne as-tu cette erreur ? Sans doute celle-ci :
Qu'est-ce que c'est ce $c ? D'où sort-il ?
$cnx->query($sql,$c)
Qu'est-ce que c'est ce $c ? D'où sort-il ?
Je me suis renseigné depuis sur des forums, j'en suis là :
ça devrait marcher, et pourtant j'ai cette erreur :
Warning: PDO::query() expects parameter 1 to be string, object given...à cette ligne :
Merci de ton aide !
// requete sql if($archives != 'off') { $sql = $cnx->prepare("SELECT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM ".$prefixe." WHERE valide!= ? AND date >= '".$datum."' ORDER BY id $ordre LIMIT ".intval($debut).",".intval($nb)); $sql->execute( array( 'inv' ) ); } else { $sql = $cnx->prepare("SELECT *, DATE_FORMAT(date, '%d.%m.%Y') as date FROM ".$prefixe." WHERE valide!= ? ORDER BY id $ordre LIMIT ".intval($debut).",".intval($nb)); $sql->execute( array( 'inv' ) ); } // parcours et affichage des résultats if($p = $cnx->query($sql)){ while($data = $p->fetch(PDO::FETCH_ASSOC)){
ça devrait marcher, et pourtant j'ai cette erreur :
Warning: PDO::query() expects parameter 1 to be string, object given...à cette ligne :
if($p = $cnx->query($sql)){
Merci de ton aide !
tu melange tout,
va voir comment fonctionne pdo, https://www.php.net/manual/fr/book.pdo.php
apres si tu as des questions, demande, mais je pense pas que tu t'es trop renseigné.
voici une requete pas à pas :
va voir comment fonctionne pdo, https://www.php.net/manual/fr/book.pdo.php
apres si tu as des questions, demande, mais je pense pas que tu t'es trop renseigné.
voici une requete pas à pas :
une requete préparée : $sql c'est ta requete (text brute) $sql = "SELECT * FROM table WHERE id = :id"; $cnx ets ton instance pdo tu te connecte à l'instance pdo puis prepare ta requete $req = $cnx->prepare( $sql ); $req est le resultat qu'il faut executer avec la valeur du parametre dans prepare ( :id ) $req->execute(array(':id' => $id)); seulement maintenant, tu recupere les données while($data = $req->fetch(PDO::FETCH_ASSOC)){ } une requete simple : (sans parametre) $sql c'est ta requete (text brute) $sql = "SELECT * FROM table "; tu peux faire query directement sans prepare ni execute $req = $cnx->query($sql)
Avec une requête simple, ça marche, mes news s'affichent. J'avais compris qu'il fallait obligatoirement préparer ses requêtes pour éviter les injections sql.
si tu prépare tes requêtes de cette facon
$rq = $pdo->prepare('SELECT * FROM table WHERE id=\''.$id.'\' LIMIT 1');
tu n'évite en rien les injections sql
par contre si tu prépare ta requête comme ça
$rq = $pdo->prepare(SELECT * FROM table WHERE id = :id LIMIT 1);
là tu passes la valeur id est considéré comme une variable elle n'est plus simplement concaténé à la requête
$rq = $pdo->prepare('SELECT * FROM table WHERE id=\''.$id.'\' LIMIT 1');
tu n'évite en rien les injections sql
par contre si tu prépare ta requête comme ça
$rq = $pdo->prepare(SELECT * FROM table WHERE id = :id LIMIT 1);
là tu passes la valeur id est considéré comme une variable elle n'est plus simplement concaténé à la requête