Une seule requete PDO avec 2 bases de donnees MySQL

Mammouth du PHP | 725 Messages

24 juil. 2011, 17:18

je l'ai change par STR:
$prep->bindValue(1, $PARAM_nom_bd1.'.users.id1', PDO::PARAM_STR);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 juil. 2011, 17:26

je l'ai change par STR:

oui mais non, si ton id, dans la table, est définit comme un entier cela va poser problème, et tu va avoir une erreur SQL !


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

24 juil. 2011, 17:34

j'ai essaye de mettre une seule variable et de la mettre en bind:
$x = $PARAM_nom_bd1.'.users.';
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = '.$x.'?';
echo $query.'<br />';

$prep = $connexion->prepare($query);
$prep->bindValue(1, 'id1', PDO::PARAM_INT);
$prep->execute();
je recois cette erreur:
Warning: PDOStatement::execute() [pdostatement.execute]: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''id1'' at line 1 in pdo2databases.php on line 42
ligne42:
$prep->execute();

ViPHP
ViPHP | 5462 Messages

24 juil. 2011, 17:50

si tu veux mettre des paramètres en préparer il faut utilise le caractère ?
je te conseil d'aller voir des tutos sur PDO, et les requêtes préparées, si t'es pas a l'aise avec ca, utilise juste query

Mammouth du PHP | 725 Messages

24 juil. 2011, 19:44

si tu veux mettre des paramètres en préparer il faut utilise le caractère ?
je te conseil d'aller voir des tutos sur PDO, et les requêtes préparées, si t'es pas a l'aise avec ca, utilise juste query
j'ai mis le ?, je l'ai mis en 2 exemples:

1er exemple: en mettant toutes les donnees (BDD, table et champs id1 en ?)
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = ?';
$prep = $connexion->prepare($query);
$prep->bindValue(1, $PARAM_nom_bd1.'.users.id1', PDO::PARAM_INT);

2eme exemple: en deffinissant une variable "x" pour les donnees (BDD et table) et pour le ? serait id1:
$x = $PARAM_nom_bd1.'.users.';
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = '.$x.'?';

$prep = $connexion->prepare($query);
$prep->bindValue(1, 'id1', PDO::PARAM_INT);

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 juil. 2011, 22:00

Que ce soit ? ou :id ça change rien (enfin il ne me semble, stealth35 j'me goure ?).

tu met dans le bindvalue , pour la valeur, 'id1' c'est une chaine de caractère que tu le veuille ou non c'est comme ça.

on te parle d'entier car, généralement "id" est une utilisé pour une une clef primaire, qui généralement est un entier.

si ce paramètre est pour une "jointure" (genre table1.id = table2.id) c'est un poil plus complexe car utiliser une chaine va te donner ( table1.id = 'table2.id' or mysql va faire une comparaison de la chaine de caractère et non du nom de colonne.


donne nous un exemple de la chaine que tu souhaite au final afin que l'on puisse mieux comprendre ce que tu souhaite faire !


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

25 juil. 2011, 01:06

voici un exemple:
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = ?';
echo $query.'<br />';
$prep = $connexion->prepare($query);
$prep->bindValue(1, 1, PDO::PARAM_INT);
soit: "$PARAM_nom_bd1.'.users.id1'" est ega a 1

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 juil. 2011, 08:19

ok, cette requête fonctionne ? (en forçant le 1 ?)

si oui, comment obtient l'id de l'admin que tu souhaite passer passer en paramètre de la requête (formulaire, session ?).

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

25 juil. 2011, 10:16

en mettant le "1" la requete retourne un resultat, et pour la condition WHERE, je voudrais selectionner tous les admins qui ont le meme identificateur que les users (id = id1), je n'ai pas precise de valeur ni par formulaire ni par session, c'est une variable qui doit etre egal a l'autre variable.

Avec phpmyadmin ca marche bien:
SELECT * FROM tests.admin, test.users WHERE tests.admin.id = test.users.id1
Showing rows 0 - 0 (1 total, Query took 0.0330 sec)
et meme avec du php et SQL sans mettre bindValue:
$query = 'SELECT * FROM '.$PARAM_nom_bd.'.admin, '.$PARAM_nom_bd1.'.users WHERE '.$PARAM_nom_bd.'.admin.id = '.$PARAM_nom_bd1.'.users.id1';

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 juil. 2011, 10:42

ahhh ben wé dans ce cas pas besoin de bindvalue d'ailleur c'est une jointure que tu fait la.

essai
SELECT * FROM tests.admin  inner join test.user on  tests.admin.id = test.users.id1
au passage c'est deux bases tests et test ? c'est assez moyen comme nom, en général mais en particulier deux pareils on pige pas ton truc (si j'avais vu le s au dernier moyen j'aurais râlé sur le fait que tu confond base et table :mrgreen: mais ça semble pas le cas ;) )


@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

25 juil. 2011, 12:26

ahhh ben wé dans ce cas pas besoin de bindvalue d'ailleur c'est une jointure que tu fait la.
alors j'ai entendu parle que bindValue sert a proteger les donnees en mettant un ? dans la requete et en l'appelant avec bindValue, est ce correcte? sinon c'est quoi le role principal de bindValue??

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 juil. 2011, 13:36

le rôle principal c'est de lier une valeur a un paramètre dans une requête préparée, et oui il permet de "protéger" la donnée en indiquant le type (sinon string par défaut).

le problème la c'est que ce n'est pas une donnée c'est une partie de ta requête/ ça peut être variable bien sur (bien que je pense qu'au final ce n'est pas le cas puisse que tu souhaite si tu veux tous les admins :)).

a tu essayé la requête que j'ai mis avant avec phpmyadmin ?
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

25 juil. 2011, 13:56

j'ai essaye avec php et phpmyadmin ca marche, puisqu'il ne s'agit pas de variables, alors c'est quoi la solution afin d'assigner des valeurs aux parametres? puisque bindValue sert a proteger les donnees, je pense qu'on aura pas besoin de mysql_real_escape_string

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

25 juil. 2011, 15:59

pour assigner une valeur a un paramètre c'est bindvalue !

Mais un paramètre c'est une valeur que tu passe pour l'utiliser en paramètre : (where truc = 'machin') !

La ce n'est pas le cas c'est la structure de la requête.

en théorie tu n'a pas besoin de modifier cela si ta liste est celle des admin, une fois que tu sais comment l'obtenir tu la modifie pas ;)

je ne comprend pas pourquoi tu veux passer cela comme un paramètre, d’où viens ce choix ?

@+
Il en faut peu pour être heureux ......

Mammouth du PHP | 725 Messages

25 juil. 2011, 17:34

je ne comprend pas pourquoi tu veux passer cela comme un paramètre, d’où viens ce choix ?
@+
j'ai entendu parler de bindValue protege les donnees entrees, c'est comme mysql_real_escape_string