Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Oracle !


Sujet :

PHP & Base de données

  1. #1
    Nouveau Candidat au Club
    Oracle !
    Bonjour,

    J'ai un problème que je n'arrive pas à résoudre avec la fonction oci_bind_by_name .
    En effet, il semblerait que les bv ne prennent que des int en compte, je n'arrive pas a insérer de chaîne de caractères... Quand je met les variables en dur dans la requête, elle fonctionne.
    Pouvez-vous m'aider svp ?

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $crit = 'nom_entreprise';
    $value = 'Capgemini';
    $req = oci_parse($db,"SELECT * FROM entreprise WHERE :crit = :value ORDER BY :crit");
    oci_bind_by_name($req, ":crit",$crit);
    oci_bind_by_name($req, ":value",$value );
    oci_execute($req);
    while ($row = oci_fetch_array($req, OCI_ASSOC+OCI_RETURN_NULLS)) 
    {
    	$entreprise[] = new Entreprise($row);
    }

  2. #2
    Modératrice

    Tu ne peux passer un nom de colonne en paramètre, il va le considérer comme une chaine.
    L'équivalent SQL de ta requête en l'état serait ceci (note les quotes)
    Code sql :Sélectionner tout -Visualiser dans une fenêtre à part
    SELECT * FROM entreprise WHERE 'nom_entreprise' = 'Capgemini' ORDER BY 'nom_entreprise'

    C'est le order by qui provoque l'erreur, mais même sans tu n'obtiendras jamais de réponse.

    Seules les valeurs peuvent être passés en paramètre, tout le reste doit être inséré à la main dans la requête. Tu peux éventuellement utiliser sprintf si tu veux rendre la chaine variable :

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $crit = 'nom_entreprise';
    $value = 'Capgemini';
    $sql = sprintf( 'SELECT * FROM entreprise WHERE %1$s = :value ORDER BY %1$s', $crit);
    $req = oci_parse($db,$sql);
    oci_bind_by_name($req, ":value",$value );
    oci_execute($req);
    while ($row = oci_fetch_array($req, OCI_ASSOC+OCI_RETURN_NULLS)) 
    {
    	$entreprise[] = new Entreprise($row);
    }

    A noter que si $crit vient de l'extérieur (par exemple d'un formulaire), il est recommandé de mettre une sécurité pour éviter d'insérer n'importe quoi, par exemple, en comparant la valeur à une liste de valeurs autorisées.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

###raw>template_hook.ano_emploi###