[RESOLU] Requête préparé avec ? ne récupère rien

Eléphant du PHP | 385 Messages

29 janv. 2019, 18:54

Bonjour à tous,

Pourriez vous m'aider?

J'ai une fonction qui permet de matcher dans ma base une date en la décomposant, avec différents paramètres ex '1 à 4 mois' '2 semaines' les paramètres aussi.

J'ai une fonction pour matcher avec un nombre de paramètre qui varie, qui va chercher en base de données, mais cela ne fonctionne pas

Code : Tout sélectionner

public function getIdTermDateWp(array $terms) : int { try { $db = $this->db; $params = array($this->taxonomies['category']); // USE SLUG $sql = "SELECT te.term_id FROM pu_wp_term_taxonomy as ta INNER JOIN pu_wp_terms as te ON ta.term_taxonomy_id = te.term_id WHERE ta.taxonomy = ? && te.slug LIKE '%"; foreach($terms as $term) { $sql .= '?%'; array_push($params, $term); } $sql .= "'"; // close like parameters $stmt = $db->prepare($sql); $stmt->execute(array_values($params)); $row = $stmt->fetch(); echo '<pre style="background-color:black;color:white;">';var_dump($sql, $params, $row);echo '</pre>';die; return (!empty($row['term_id'])) ? $row['term_id'] : 0; } catch(PDOException $e) { echo 'getIdTerm term:' . $terms . ' error ' . $e->getMessage(); return 0; } }
J'ai avec mon var_dump

Code : Tout sélectionner

string(175) "string(175) "SELECT te.term_id FROM pu_wp_term_taxonomy as ta INNER JOIN pu_wp_terms as te ON ta.term_taxonomy_id = te.term_id WHERE ta.taxonomy = ? && te.slug LIKE '%?%?%?%'" array(4) { [0]=> string(16) "listing_category" [1]=> string(1) "1" [2]=> string(1) "4" [3]=> string(4) "mois" } bool(false)
Si je test dans phpmyadmin

Code : Tout sélectionner

SELECT te.term_id FROM pu_wp_term_taxonomy as ta INNER JOIN pu_wp_terms as te ON ta.term_taxonomy_id = te.term_id WHERE ta.taxonomy = 'listing_category' && te.slug LIKE '%1%4%mois%'
J'ai bien le bonne id retourné et pas d'erreur pdo.
Je pense que le problème vient des ?.

Auriez vous une piste?
Merci :)

Mammouth du PHP | 1967 Messages

30 janv. 2019, 10:17

J'essaierai en ne mettant qu'un ? dans ton like et en concaténant mes arguments dans la boucle avec un % en début et fin,

sinon en nommant les paramètres ?
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 9782 Messages

30 janv. 2019, 10:49

Effectivement, il faut que tes caractères joker (% dans ton cas) soient dans la variable que tu transmets et non pas en dur dans la requête.

Dans la requête uniquement LIKE ? avec donc une seule variable.
Et c'est dans la construction de cette variable que tu concatènes ce que tu veux, autres variables et joker.
Quand tout le reste a échoué, lisez le mode d'emploi...

Eléphant du PHP | 385 Messages

30 janv. 2019, 11:30

Merci,

Exact les caractères % étaient le problème.
Merci de votre aide.

Code : Tout sélectionner

/* get id from wordpress table, with array order ex : [1,2,month] * * @param string array $terms order element contain in date * @return int id */ public function getIdTermDateWp(array $terms) : int { try { $db = $this->db; $params = array($this->taxonomies['category']); // USE SLUG $sql = "SELECT te.term_id FROM pu_wp_term_taxonomy as ta INNER JOIN pu_wp_terms as te ON ta.term_taxonomy_id = te.term_id WHERE ta.taxonomy = ? && te.slug LIKE ?"; // init like request $keyword = '%'; foreach($terms as $term) $keyword .= $term . '%'; // send keyword to array parameter for sql array_push($params, $keyword); $stmt = $db->prepare($sql); $stmt->execute(array_values($params)); $row = $stmt->fetch(); return (!empty($row['term_id'])) ? $row['term_id'] : 0; } catch(PDOException $e) { echo 'getIdTerm term:' . $terms . ' error ' . $e->getMessage(); return 0; } }