Question

Dans mon modèle de ressources personnalisé, j'essaie d'utiliser fetchAssoc pour obtenir des données d'une table.J'essaie de citer un tableau dans une instruction IN et j'ai remarqué que cela ne fonctionne pas (renvoie un tableau vide) lors de l'utilisation de liaisons nommées.Cependant, en utilisant le deuxième argument de $select->where() citer les valeurs dans fonctionne bien.

Je suis juste curieux de savoir pourquoi cela ne fonctionne pas...

$bind = array( 
    'expert_id' => $expert_id,
    'product_id' => $adapter->quote($product_id),
);

//Debug:  Array ( [expert_id] => 1, [product_id] => '3032', '3091', '3132' )

$select = $adapter->select()
    ->from($this->getTable('namespace_module/table'), '*')
    ->where('product_id IN(:product_id)')
    ->where('expert_id = :expert_id');

// Debug: SELECT `namespace_module_table`.* FROM `namespace_module_table` WHERE (product_id IN('3032', '3091', '3132')) AND (expert_id = :expert_id)

mais c'est le cas ?

$bind = array( 
    'expert_id' => $expert_id,
);

//Debug: Array(  [expert_id] => 1 )

$select = $adapter->select()
    ->from($this->getTable('namespace_module/table'), '*')
    ->where('product_id IN(?)', $product_id)
    ->where('expert_id = :expert_id');

// Debug: SELECT `namespace_module_table`.* FROM `namespace_module_table` WHERE (product_id IN(:product_id)) AND (expert_id = :expert_id)

Est-ce une règle générale que vous ne pouvez pas utiliser de paramètres liés dans une instruction IN ?j'ai vu ce et ce, mais je pensais que Magento $adapter->quote La méthode était censée s’occuper de transformer le tableau en liste.

Était-ce utile?

La solution

Magento et la plupart des abstractions de bases de données PHP modernes s'appuient en fin de compte sur l'implémentation des paramètres liés de la bibliothèque PDO pour la prise en charge des paramètres liés. PDO ne prend pas en charge la liaison d'un tableau à un paramètre IN pour des raisons?C'est comme ça depuis que j'utilise la bibliothèque, et c'est très ennuyeux.

Pour contourner ce problème, de nombreuses abstractions de bases de données PHP proposent IN soutien pour les leurs, non lié paramètres.Dans le deuxième exemple de code, les bibliothèques d'abstraction SQL sous-jacentes de Magento génèrent un IN instruction pour vous avec les valeurs codées en dur du tableau, puis l'envoyer à la base de données.Ceci est différent de l'utilisation d'un paramètre lié : avec un paramètre lié, vous envoyez une instruction SQL avec ce paramètre lié à la base de données et indiquez également à la base de données quelles variables s'appliquent à quels paramètres.

Licencié sous: CC-BY-SA avec attribution
Non affilié à magento.stackexchange
scroll top