Bonjour, je suis en train de créer un script, mais je bloque à une étape, mon script procède comme ceci:
(J'utilise SQL Server et les drivers ODBC)
Formulaire:
un champ à remplir, le nom de l'objet à rechercher ($ItemName)
Voici le fonctionnement de mon script:
Si $ItemName est défini, alors
{
1) Recherche du groupe d'objet dans le quelle est l'objet $ItemName dans la table dbo.Items (Colones utilisés: ItemName et Grade; Grade est le groupe d'objet représenté par un entier int entre 0 et 999)
2) Recherche des identifiants des monstres portant le groupe d'objet dans la table dbo.MobItems (à partir du groupe d'objet de l'étape 1 - Colones utilisés: Grade et MobID, MobID est l'identifiant du monstre, représenté par un entier de 1 à 9999)
Et enfin, le problème:
3)Remplacer les identifiants des monstres par leurs noms dans la table dbo.Mob (à partir de leur identifiants trouvés dans l'étape 2 - Colones utilisés: MobID et MobName, ou MobName est le nom du monstre en lettres portant le groupe d'objet (Grade) dans le quelle figure $MobItem )
}
Ou alors on dit de remplir le champ du nom d'objet.
EN GROS: Un joueur donne le nom de l'objet -> Qui donne son groupe (grade) -> qui donne l'id du monstre -> Qui donne normalement le nom du monstre, présent sur un autre table sql.
Avec les valeur commune entre les deux première table (Items et MobItems) Grade (int), et les valeur commune entre les deux dernières (MobItems et Mobs) MobID(int)
Actuellement, mon script marche jusqu'a l'étape 2 et donne comme résultat tout les identifiants des monstres, mais le problème est qu'un joueur ne connait pas ces identifiant, et n'en a pas accès.
Le problème étant que le résultat de l'étape deux se présente sous cette forme:
977
1813
1814
et le nombre de résultat peut varier et je ne sais pas comment récupérer individuellement ces résultat pour trouver leur nom.
Je débute le PHP et je ne sais pas si la fonction array peut faire le travail, mais je ne sais pas comment l'utiliser pour, j'aurais besoin d'un petit peut d'aide ^^
Bonne journée à vous et merci d'avance
Si j'ai bien compris, tu as une table MobItems qui contient les ID des Mobs et ce que tu veux faire c'est à partir d'un MobItems.MobID récupérer le Mobs.MobName
Si c'st bien ça : il faut que tu apprennes à te servir des jointures (je te laisse faire une recherche Google la dessus)
SELECT Mob.MobID, Mob.MobName
FROM MobItems
INNER JOIN Mob ON Mob.MobID = MobItems.MobID
WHERE ...
PS : Tes noms de table / colonne sont pas top
PS2 : Essaie de faire plus court la prochaine fois
faire c'est à partir d'un MobItems.MobID récupérer le Mobs.MobName
Oui c'est bien ça!
Je vais essayer sa tout de suite, merci bien, je connaissait pas trop les jointres, j'essaye sa tout de suite! ;)
Et oui désolé du pavé, j'avais peur de pas être compris
et ceci:
Tes noms de table / colonne sont pas top
C'est à dire? Au faite c'est pas moi qui les ai crée mais un studio de jeu directement (je suis l'administrateur d'un serveur privé - shaiya-legacy.lyrosgames.com/)
Le 23 avril 2015 à 14:38:02 _Fali_ a écrit :
Tes noms de table / colonne sont pas top
C'est à dire?
Premièrement ne met pas de majuscules : par exemple au lieu de MobItem mets plutôt mob_item, pareil pour MobName, MobId, ...
Ensuite dans ta table Mobs je trouve pas ça très pertinent d'avoir un champ MobName, l'idéal serait simplement name (on sait que ce que tu mets dans ta table Mobs à un rapport avec des Mobs, pas la peine de le rappeler)
Une page qui regroupe les bonnes pratiques : http://sql.sh/1396-nom-table-colonne
Von voici mon code:
include ('db.php');
//include ('query.php');
Echo ('Retour au <a href="form.php">formulaire</a><br/>');
if (isset($_POST['Var1']))
{
$ItemName=$_POST['Var1'];
$MobID="USE PS_GameDefs
SELECT MobID, MobName
FROM dbo.MobItems
INNER JOIN Mobs ON dbo.Mobs.MobID = dbo.MobItems.MobID
WHERE Grade = (SELECT Grade from dbo.Items
WHERE ItemName like '$ItemName')";
//2-3
$end=odbc_exec($conn,$MobID);
while( $row = odbc_fetch_array($conn,$end) ) {
print_r($row);
}
}
Else if (empty($_POST['Var1']))
{
echo("Merci de remplir le ou les champs obligatoires");
}
(essayez de coller dans un logiciel comme notpad++ je n'ai pas trouver la fonction [code] des atres forum désolé)
Il retourne ça:
Warning: odbc_exec(): SQL error: [Microsoft][ODBC SQL Server Driver][SQL Server]Ambiguous column name 'MobID'., SQL state 37000 in SQLExecDirect in C:\www\dropfinder\proc.php on line 24
Warning: odbc_fetch_array(): supplied resource is not a valid ODBC result resource in C:\www\dropfinder\proc.php on line 25
Et aucun résultat désiré, j'ai oublié quelque chose? Mal interprété la façon d'utiliser "INNER JOIN" ?
Je suis vraiment débutant désolé pour tout mes questions :/
Le truc imporant c'est ça :
Ambiguous column name 'MobID'
Ce qu'il te dit c'est que dans ta requête le champ MobID appartient à plusieurs table différente et il ne sait simplement pas lequel choisir
Il te suffit de prefixer le nom du champ par la table qui t'interesse
SELECT Mobs.MobID, Mobs.MobName ...
+ T'as pas besoin de répéter le nom de la base de donnée (à moins que ce soit une spécificité de ODBC )
T'as pas besoin de répéter le nom de la base de donnée
ma variable $conn ne contient pas le nom de la base de données, pour sa que je le met.
Par contre, la mon script ne génère aucune erreur, mais ne donne aucun résultat, rien.
Voici la page proc.php
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Drop Finder</title>
</head>
<body>
<?
include ('db.php');
//include ('query.php');
Echo ('Retour au <a href="form.php">formulaire</a><br/>');
if (isset($_POST['Var1']))
{
$ItemName=$_POST['Var1'];
$MobID="USE PS_GameDefs
SELECT dbo.Mobs.MobID, dbo.Mobs.MobName
FROM dbo.MobItems
INNER JOIN Mobs ON dbo.Mobs.MobID = dbo.MobItems.MobID
WHERE Grade = (SELECT Grade from dbo.Items
WHERE ItemName like '$ItemName')";
$end=odbc_exec($conn,$MobID);
while($row = odbc_fetch_array($end)) {
print_r($row);
}
}
Else if (empty($_POST['Var1']))
{
echo("Merci de remplir le ou les champs obligatoires");
}
?>
</body>
</html>
et son formulaire, form.php:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Drop finder</title>
</head>
<body>
<center>Drop Finder
<h1>Trouver un drop</h1>
<small>Vous devrez au préalable connaitre le nom EXACTE de l'objet recherché (Exemple: Poudre Alchimique Magique) afin de trouver la liste des monstres qui le détienne</small>
<br/>
<br/>
<form action = "proc.php" method="post">
<p>Nom de l'objet* <input type = "text" name = "Var1"><br /></p>
<br/>
<input type="submit" name="send_price" value="Envoyer">
</form>
<br/>
<br/>
<small></small></center>
</body>
</html>
et enfin la page db.php
<?php
$host='MONIP';
$user='MONID;
$pass='MONPW';
$conn = @odbc_connect("Driver={SQL Server};Server=$host;", $user, $pass) or die("Unable to connect to database!");
function mssql_escape_string($data) {
if(!isset($data) or empty($data)) return '';
if(is_numeric($data)) return $data;
$non_displayables = array(
'/%0[0-8bcef]/', // url encoded 00-08, 11, 12, 14, 15
'/%1[0-9a-f]/', // url encoded 16-31
'/[\x00-\x08]/', // 00-08
'/\x0b/', // 11
'/\x0c/', // 12
'/[\x0e-\x1f]/' // 14-31
);
foreach($non_displayables as $regex)
$data = preg_replace($regex,'',$data);
$data = str_replace("'","''",$data);
return $data;
}
?>
Pouvez vous m'éclairer sur ce qui ne va pas? Je suis à cour d'idée je m'arrache les cheveux dessus, je ne vois vraiment pas, j'ai regardé sur plusieurs site pour vérifier les fonction qui j'aurais pu éventuellement mal utiliser mais je vois pas, si vous voulez je pourrais envoyer mes tables vous vous en avez besoins. Ecore une fois je débute, et je suis vraiment désolé de vous déranger... Mais je vous remerci énormément en tout cas de m'aider.
Ok c'est bon j'ai trouvé,
SELECT dbo.Mobs.MobID, dbo.Mobs.MobName
FROM dbo.MobItems
INNER JOIN Mobs ON dbo.Mobs.MobID = dbo.MobItems.MobID
WHERE Grade = (SELECT Grade from dbo.Items
WHERE ItemName like '$ItemName')"
Enfaite, c'est ceci (SELECT Grade from dbo.Items
WHERE ItemName like '$ItemName') qui peut retourner plusieurs ligne, j'ai donc mis un message d'érreur si c'était le cas. Merci beaucoup pour ton aide! sujet résolu
Transforme ça...
WHERE Grade = (SELECT Grade from dbo.Items WHERE ItemName like '$ItemName')"
... en ça...
WHERE Grade IN (SELECT Grade from dbo.Items WHERE ItemName like '$ItemName')"
... et ton problème sera corrigé