2017-06-24 1 views
3

J'ai une simple classe DB avec cette méthodeSUR LES CONFLITS avec pg_prepare() erreurs de nom »n'existe pas

function __construct($host, $user, $pass, $db) { 
    $this->link = pg_connect("host=$host port=5432 dbname=$db user=$user password=$pass") or $this->error(); 
} 

public function run($sql, $args = null) { 
    if(!$args) 
     $this->query = pg_query($sql); 
    else { 
     $v = md5(uniqid(mt_rand(), true)); 
     $this->query = pg_prepare($v, $sql); 
     $this->query = pg_execute($v, $args); 
    } 
    return $this; 
} 

L'utilisation de ce que je peux la requête suivante sans instructions préparées, et il fonctionne parfaitement bien.

$db->run(" 
    INSERT INTO userExercise (userid, exerciseid, date, sets) 
    VALUES ($user->id, $exerciseid, '$date', '$sets') 

    ON CONFLICT (userid, date, exerciseid) 
    DO UPDATE SET sets = '$sets' 

    RETURNING LASTVAL()" 
); 

Cependant quand je fais un prêt, je reçois l'erreur « ERREUR: déclaration préparée « 41982c47c3c84749552cd9808ad03422 »n'existe pas »

$db->run(" 
     INSERT INTO userExercise (userid, exerciseid, date, sets) 
     VALUES ($1, $2, $3 $4) 

     ON CONFLICT (userid, date, exerciseid) 
     DO UPDATE SET sets = $4 

     RETURNING LASTVAL()", 
     [$user->id, $exerciseid, $date, $sets] 
    ); 

Le 41982c47c3c84749552cd9808ad03422 résultant de md5 donner un nom unique. Le problème semble provenir du ON CONFLICT. Comment je peux résoudre ce problème?

+0

Si vous définissez '$ v =" abc "', cela fonctionne-t-il? –

+0

Même erreur. déclaration préparée "abc" n'existe pas – ditto

Répondre

3

Vous ne vérifiez pas le résultat de pg_prepare et il y a probablement une erreur de syntaxe. Comme VALUES ($1, $2, $3 $4) devrait avoir 1 autre virgule.

Aussi, RETURNING LASTVAL() devrait probablement être quelque chose comme RETURNING ID, ou quelle que soit votre colonne de série est appelée. Sinon, vous obtiendrez des résultats faux pour le cas de conflit.