2010-07-28 3 views
0

Donc je fais une recherche et j'utilise un implode dans mon instruction select, que je trouve très utile. Fondamentalement, ce moteur de recherche aura 3 sélections différentes qui vont sélectionner différentes choses en fonction de différents critères et quand j'utilise mon implode, je reçois une erreur d'arguments non valables passés.php implode question

Voici ma déclaration sql:

 
$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 
AND gender.gender = '".$gender."') 
OR ((interests.activity = '".implode('\' OR interests.activity = \'',$array)."') 
AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))";

Le deuxième imploser pour les intérêts est là que je commencé à avoir mon problème et $ array est un tableau. Une autre chose que je ne comprends pas est que quand j'exécute mon code, j'obtiens les bons résultats, mais je reçois toujours l'erreur que je passe des arguments invalides.

+0

Je dois donc être absolument retardé parce que quand je suis allé chercher du code pour poster, j'ai réalisé que je venais de perdre un peu de temps et que je ne me rendais pas compte que mon code était hors service. Désolé de faire ce fil pour une réponse simple. Merci les gars qui ont aidé mais c'est très apprécié! – Chris

Répondre

0

Vous essayez de tout faire sur une grande déclaration. Pourquoi ne pas construire vos tableaux-chaînes implosés avant de les inclure dans le SQL?

0

Chris, votre problème est que vous n'êtes pas passer un tableau au second paramètre de implode().

Si vous voyez www.php.net/implode le second paramètre doit être de type MATRICE pour que PHP peut commencer à se joindre à votre tableau avec votre delimiter spécifié dans le premier paramètre.

Une bonne façon de vérifier le type de votre variable est d'utiliser des données var_dump() qui vous dira si quelque chose est un tableau, ou int..etc

Il y a deux variables que vous êtes de passage à implode() là. $ age et $ array, Je devine que c'est l'âge et que vous avez besoin de modifier un peu votre code. Coller l'ensemble de votre code générant $ array et $ age nous aidera à voir plus loin où vous allez mal dans la création de ces variables.

Espérons que cela aide.

2

Vous pouvez croire ce que dit PHP, normalement. S'il dit que ce n'est pas un tableau, vous n'avez probablement pas passé un tableau.

Et une petite astuce pour vous faire gagner un peu de code: Il y a une déclaration IN() MySQL:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE (grades.year IN(".implode(',', $age).") 
AND gender.gender = '".$gender."') 
OR (interests.activity IN('".implode("','", $array)."') 
AND grades.year = ".$age." AND gender.gender = '".$gender."')"; 

Pour enregistrer le double gender.gender = $gender et (peut-être) d'optimiser la requête:

$sql = "SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link FROM ((camp INNER JOIN gender ON camp.id = gender.camp_id) 
INNER JOIN grades ON camp.id = grades.camp_id) 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

plus Je pense que MySQL ne nécessite pas d'utiliser toutes ces parenthèses pour les jointures:

$sql = 
"SELECT DISTINCT camp.title, camp.startDay, camp.typeOfCamp, camp.endDay, 
camp.link 
FROM camp 
INNER JOIN gender ON camp.id = gender.camp_id 
INNER JOIN grades ON camp.id = grades.camp_id 
INNER JOIN interests ON camp.id = interests.camp_id 
WHERE gender.gender = '".$gender."' 
AND (
    grades.year IN(".implode(',', $age).") 
    OR (
     interests.activity IN('".implode("','", $array)."') 
     AND grades.year = ".$age." 
    ) 
)"; 

Maintenant, la requête devrait être beaucoup mieux comprendre.

+0

Votre droit MySQL ne nécessite pas les parenthèses, mais j'ai développé cela pour l'utilisation d'une base de données Access, mais j'essaie maintenant de l'utiliser avec MySQL. Aussi cette solution n'a pas fonctionné. – Chris

0

Depuis que vous utilisez des chaînes:

OR (interests.activity IN ('".implode("','", $array)."') 

va neaten jusqu'à cette ligne.

Mais je suis inquiet au sujet de l'âge.Vous pouvez l'utiliser comme si elle est un tableau dans:

WHERE ((grades.year = '".implode('\' OR grades.year = \'',$age)."') 

mais comme une variable de chaîne:

AND (grades.year = '".$age."' AND gender.gender = '".$gender."'))"; 

Je pense que vous devriez utiliser le « IN » et implode() expressions pour les deux endroits que vous utilisez $ age si c'est un tableau.