2009-10-08 10 views
0

J'ai cette fonction:La fonction ne renvoie pas la ressource correcte

function query_dp($sql) { 
    $link = mysql_connect('localhost', $bd_id, $bd_pass); 
    mysql_select_db("$bd"); 

    if (!$link) { 
     die('Could not connect: ' . mysql_error()); 
    } 

    return mysql_query($sql) or die(mysql_error()); 

    mysql_close($link); 
} 

Dans le programme principal, lorsque je tente de faire:

echo mysql_num_rows(query_db($sql)); 

-je obtenir que le retour

1 

Lorsque je n'encapsule pas ce code dans une fonction et que je l'utilise directement dans le programme principal, j'obtiens le nombre de lignes récupérées.

La fonction ne renvoie pas une ressource mais un entier? WTF?

Toute aide serait grandement appréciée!

+3

vous ne pouvez pas fermer le lien après le retour. vous ne voulez pas fermer le lien tant que vous n'avez pas fini de le lire. –

+2

Vous ne savez pas si c'est pertinent, mais vous appelez 'query_db()' mais votre fonction s'appelle 'query_dp()' –

+2

BTW votre retour avant que votre mysql_close() termine l'appel de la fonction. Mysql_close() n'est même pas appelé –

Répondre

3

vos variables $bd_id, $bd_pass et $bd ne sont pas visibles dans la fonction car ils sont probablement déclarés dans la scope mondiale et non la portée locale de cette fonction.

Vous pouvez soit rendre les variables globales accessibles en utilisant le global keyword, en utilisant le $GLOBALS variable, ou par passing them to the function.

0

Ceci ne répond pas directement à votre question, mais vous ne devez pas utiliser l'interface mysql d'origine. c'est maladroit et procédural. Jetez un oeil à la mysqli interface. Ne pas essayer d'envelopper les anciennes fonctions si vous avez un langage standard pris en charge qui fait déjà: D

Vous code ci-dessus devient juste

$m = new MysqlI(...); 
$rc = $m->query(...); 
echo $rc->num_rows(); 
1

votre appel à mysql_close signifie que vous n'avez plus un lien à la ressource mysql dont vous avez besoin dans mysql_num_rows

+3

Vous ne pouvez pas fermer une connexion après un retour;) –

1

Le problème est dans l'opérateur "ou". Votre fonction renvoie le résultat de « mysql_query ($ sql) ou mourir (mysql_error()) » expression, qui est 1 ou 0. Je vous suggère d'utiliser quelque chose comme ceci:

$query_result = mysql_query($sql); 
if (!$query_result) { 
    die(mysql_error()); 
} 
return $query_result; 

également la dernière ligne de cette fonction " mysql_close ($ link) "n'est jamais appelé.

+0

Incorrect, l'astuce PHP 'OR DIE' est valide depuis la v.3.0. Recherche SO, il y a une question pertinente. Bien que je dois admettre que c'est une habitude très bab. – Anax

+1

Essayez d'exécuter le code à partir de http://pastebin.com/m4301f239. Vous verrez 'bool (true)', mais pas la chaîne 'string (6)" '' –

+0

Comment fonctionne l'opérateur OR. Dans le cas de la fonction thing(), elle est évaluée TRUE (ou en fait NOT FALSE, voir http://www.php.net/manual/ro/language.types.boolean.php), donc la partie DIE n'est jamais réalisé. C'est la même chose avec la fonction mysql_connect. Si la connexion échoue, l'opérateur OU de court-circuit choisit la deuxième partie (DIE). – Anax

Questions connexes