web-dev-qa-db-fra.com

mysqli_fetch_assoc () s'attend à ce que le paramètre 1 soit mysqli_result, boolean étant donné

Dupliquer possible:
PHP: Attention: sort () s'attend à ce que le paramètre 1 soit un tableau, ressource donnée

Je suis assez nouveau pour PHP et MySQL et je n'arrive pas à comprendre celui-ci. J'ai fait des recherches dans tout le forum mais je n'ai trouvé aucune réponse qui puisse donner un sens. A l'origine, j'utilisais mysql_fetch_assoc (), mais je ne pouvais que rechercher des numéros et j'ai également reçu des erreurs lors de la recherche de lettres. J'espère que je suis sur la bonne voie ici. Merci d'avance pour toute votre aide!

$con = mysqli_connect($hostname,$username,$password) or die ("<script language='javascript'>alert('Unable to connect to database')</script>");
mysqli_select_db($con, $dbname);

if (isset($_GET['part'])){
    $partid = $_GET['part'];
    $sql = 'SELECT * 
        FROM $usertable 
        WHERE PartNumber = $partid';

    $result = mysqli_query($con, $sql);
    $row = mysqli_fetch_assoc($result);

    $partnumber = $partid;
    $nsn = $row["NSN"];
    $description = $row["Description"];
    $quantity = $row["Quantity"];
    $condition = $row["Conditio"];
}
9
user1504463

Cela se produit lorsque votre résultat n'est pas un résultat (mais un "faux" à la place) . Vous devriez changer cette ligne

$sql = 'SELECT * FROM $usertable WHERE PartNumber = $partid';

pour ça:

$sql = "SELECT * FROM $usertable WHERE PartNumber = $partid";

parce que "peut interpréter $ variables while 'ne peut pas.

Fonctionne très bien avec des entiers (nombres). Pour les chaînes, vous devez mettre la variable $ entre guillemets simples, comme

$sql = "SELECT * FROM $usertable WHERE PartNumber = '$partid' ";

Si vous voulez/devez travailler avec des guillemets simples, alors php NE PEUT PAS interpréter les variables, vous devrez le faire comme ceci:

 $sql = 'SELECT * FROM '.$usertable.' WHERE string_column = "'.$string.'" AND integer_column = '.$number.';
22
Sliq
mysqli_fetch_assoc() expects parameter 1 to be mysqli_result, boolean given

Cela signifie que le premier paramètre que vous avez transmis est un booléen (vrai ou faux).

Le premier paramètre est $result, et il s'agit de false, car la requête contient une erreur de syntaxe.

" ... WHERE PartNumber = $partid';"

Vous ne devez jamais inclure directement une variable de demande dans une requête SQL, sinon les utilisateurs peuvent injecter du SQL dans vos requêtes. (Voir SQL injection .)

Vous devriez échapper à la variable:

" ... WHERE PartNumber = '" . mysqli_escape_string($conn,$partid) . "';"

Ou mieux, utilisez Prepared Statements .

14
Arnaud Le Blanc

Vous ne citez qu'une seule fois votre instruction SQL qui crée du texte de variable au lieu de variable.

$sql = "SELECT * 
    FROM $usertable 
    WHERE PartNumber = $partid";
4
johnmadrak

Mysqli utilise la programmation orientée objet. Essayez plutôt d'utiliser cette approche:

function dbCon() {
        if($mysqli = new mysqli('$hostname','$username','$password','$databasename')) return $mysqli; else return false;
}

if(!dbCon())
exit("<script language='javascript'>alert('Unable to connect to database')</script>");
else $con=dbCon();

if (isset($_GET['part'])){
    $partid = $_GET['part'];
    $sql = "SELECT * 
        FROM $usertable 
        WHERE PartNumber = $partid";

    $result=$con->query($sql_query);
    $row = $result->fetch_assoc();

    $partnumber = $partid;
    $nsn = $row["NSN"];
    $description = $row["Description"];
    $quantity = $row["Quantity"];
    $condition = $row["Conditio"];
}

Faites-moi savoir si vous avez des questions, je ne pouvais pas tester ce code, donc vous devrez peut-être vérifier!

2
Ben Ashton

Que se passe-t-il dans votre code si $usertable n'est pas une table valide ou n'inclut pas une colonne PartNumber ou une partie n'est pas un nombre.

Vous devez échapper à $ partid et également lire le document pour mysql_fetch_assoc () car il peut renvoyer un booléen

0
TerryE