OVH Cloud OVH Cloud

Probleme de versions ?

7 réponses
Avatar
Denis Beauregard
Bonjour,

J'ai installé EasyPHP sur mon PC et le script suivant fonctionne très
bien. Mais, sur le serveur Internet, il me donne un message d'erreur.

Ce que j'ai changé par rapport à mes essais précédents, quand
j'utilisais directement le serveur Internet, c'est l'énoncé IF avec
le $_GET. J'avais $cible = $_GET['vol']; alors que maintenant, je
vérifie si la variable existe, J'imprime la requête envoyée à la
base, donc en théorie, il n'y a pas d'erreur de syntaxe et l'argument
passe comme il faut.

//reste du code omis, dont quelques function

include_once('connexion.php');

if (!array_key_exists('vol', $_GET))
{ $cible = 0; }
else
{ $cible = $_GET['vol']; };

$query = "select * from mvolume where vol =\"".$cible."\"";

echo "'".$query."'<P>";
$res = mysql_query($query);
$nb_rep = mysql_num_rows($res);
if ($nb_rep <> 1)
{ page_vide (); }
else
{ afficher_memoires ($cible, $nb_rep, $res); }

Le message est:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in ***.php on line ***

$nb_rep est vide.

En local, j'ai EasyPHP 1.7, PHP 4.3.3 et mySQL 4.0.15.
Sur Internet, j'ai PHP 4.2.2.


Denis

7 réponses

Avatar
Sebastian Lauwers
Denis Beauregard wrote:

Bonjour,


Bonsoir,

include_once('connexion.php');

if (!array_key_exists('vol', $_GET))


Utilisez plutôt:

if (!isset ($_GET['vol']) )

{ $cible = 0; }
else
{ $cible = $_GET['vol']; };

$query = "select * from mvolume where vol ="".$cible.""";

echo "'".$query."'<P>";
$res = mysql_query($query) OR die(mysql_error());


$res = mysql_query($query) OR die ( mysql_error() );

$nb_rep = mysql_num_rows($res);
if ($nb_rep <> 1)
{ page_vide (); }
else
{ afficher_memoires ($cible, $nb_rep, $res); }

Le message est:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in ***.php on line ***


Ce message indique une erreur au niveau de la requête SQL, la table est
bien remplie? Il n'y a pas d'erreur dans la requête? Vérifiez bien cela!
Le die(mysql_error()) devrait vous aider à comprendre l'erreur.


$nb_rep est vide.


Puisqu'il y a une erreur au niveau du $res ...


En local, j'ai EasyPHP 1.7, PHP 4.3.3 et mySQL 4.0.15.
Sur Internet, j'ai PHP 4.2.2.


Et mysql?

Denis


HTH,

Amicalement,
Sebastian


--
The most likely way for the world to be destroyed,
most experts agree, is by accident.
That's where we come in; we're computer professionals.
We cause accidents.
--Nathaniel Borenstein

Avatar
Frederic BISSON
$query = "select * from mvolume where vol ="".$cible.""";
Ta requête n'est pas bonne.

Si $cible=='abcd', ta ligne donne
select * from mvolume where vol="abcd"

Or, ce ne sont pas des doubles quotes mais des simples quotes en SQL. Si
une version fonctionne avec des double quotes, c'est qu'elle est un peu
trop permissive par rapport au standard (ou qu'une couche logicielle
retouche ta requête au passage).

La ligne suivante devrait mieux fonctionner :
$query = "select * from mvolume where vol ='".$cible."'";

De plus, sauf si tu es en mesure de garantir que $cible ne contiendra
jamais d'apostrophe, quel que soit l'appel, il vaut mieux écrire :
$query = "select * from mvolume where vol='".str_replace("'","''",$cible)."'";

Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in ***.php on line ***
Le message t'indique que tu as voulu appeler mysql_num_rows avec un

résultat de requête incorrect. Cela arrive la plupart du temps quand ta
requête n'est pas bonne. Dans ce cas mysql_query retourne FALSE et
mysql_num_rows(FALSE) produit ce message.

$res = mysql_query($query);
Tu as oublié les quelques lignes suivantes :

if(!$res) {
echo 'Erreur de requête';
exit(0);
}

@+

Frédéric

Avatar
Denis Beauregard
Le 16 Jul 2004 22:33:14 GMT, Sebastian Lauwers
écrivait dans fr.comp.lang.php:

Denis Beauregard wrote:

Bonjour,


Bonsoir,

include_once('connexion.php');

if (!array_key_exists('vol', $_GET))


Utilisez plutôt:

if (!isset ($_GET['vol']) )


Merci pour ces trucs.


{ $cible = 0; }
else
{ $cible = $_GET['vol']; };

$query = "select * from mvolume where vol ="".$cible.""";

echo "'".$query."'<P>";
$res = mysql_query($query) OR die(mysql_error());


$res = mysql_query($query) OR die ( mysql_error() );

$nb_rep = mysql_num_rows($res);
if ($nb_rep <> 1)
{ page_vide (); }
else
{ afficher_memoires ($cible, $nb_rep, $res); }

Le message est:
Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in ***.php on line ***


Ce message indique une erreur au niveau de la requête SQL, la table est
bien remplie? Il n'y a pas d'erreur dans la requête? Vérifiez bien cela!
Le die(mysql_error()) devrait vous aider à comprendre l'erreur.


J'obtiens quelque chose de tout à fait étrange.

J'ai ajouté le message d'erreur et cela dit que ma table n'existe
pas. J'avais déjà essayé SHOW TABLES qui me dit que j'ai 15
tables alors qu'en réalité, c'est 16. J'ai demandé à mon hébergeur
et il n'y a pas de limite.

Table 'sgcf.mvolume' doesn't exist

Mais alors, comment est-ce que phpadmin fait pour la voir cette table
si elle n'existe pas ?

$nb_rep est vide.


Puisqu'il y a une erreur au niveau du $res ...


En local, j'ai EasyPHP 1.7, PHP 4.3.3 et mySQL 4.0.15.
Sur Internet, j'ai PHP 4.2.2.


Et mysql?


3.23.58 (j'ai fouillé un peu, je m'attendais à voir un 4.x.y).


Denis


Avatar
Denis Beauregard
Le 16 Jul 2004 22:33:15 GMT, Frederic BISSON
écrivait dans fr.comp.lang.php:

$query = "select * from mvolume where vol ="".$cible.""";
Ta requête n'est pas bonne.

Si $cible=='abcd', ta ligne donne
select * from mvolume where vol="abcd"

Or, ce ne sont pas des doubles quotes mais des simples quotes en SQL. Si
une version fonctionne avec des double quotes, c'est qu'elle est un peu
trop permissive par rapport au standard (ou qu'une couche logicielle
retouche ta requête au passage).

La ligne suivante devrait mieux fonctionner :
$query = "select * from mvolume where vol ='".$cible."'";

De plus, sauf si tu es en mesure de garantir que $cible ne contiendra
jamais d'apostrophe, quel que soit l'appel, il vaut mieux écrire :
$query = "select * from mvolume where vol='".str_replace("'","''",$cible)."'";


C'est noté. En fait, pour les tests, je passe des arguments bien
précis, mais il est vrai que quelqu'un peut s'amuser à envoyer des
chaînes spéciales pour faire planter le système. Je pense que je
vais revoir de plus près le paramètre reçu. Est-ce que quelqu'un
pourrait passer ceci par exemple ?

14; commande pour effacer la table

alors que je m'attends à lire un nombre et rien d'autres ?

Warning: mysql_num_rows(): supplied argument is not a valid MySQL
result resource in ***.php on line ***
Le message t'indique que tu as voulu appeler mysql_num_rows avec un

résultat de requête incorrect. Cela arrive la plupart du temps quand ta
requête n'est pas bonne. Dans ce cas mysql_query retourne FALSE et
mysql_num_rows(FALSE) produit ce message.

$res = mysql_query($query);
Tu as oublié les quelques lignes suivantes :

if(!$res) {
echo 'Erreur de requête';
exit(0);
}


En fait, si l'argument est bon, j'affiche les détails d'un volume
et sinon, c'est la liste des volumes et il faudra choisir un volume
parmi la liste.


Denis


Avatar
Denis Beauregard
Bonjour,

Mon cas se complique !

Dans phpmyadmin, je vois un certain nombre de tables mais si je fais
un script pour afficher les tables, j'obtiens des résultats
différents.


La plupart des tables que j'ai créées il y a longtemps sont là
(interface et sortie du script).

Certaines tables que j'ai créées avec phpmyadmin et que j'ai
effacées avec cette interface (donc, avec l'interface, je ne les
vois pas), sont encore là avec le script !

Et les tables que je viens de créer avec phpmyadmin ne sont visibles
qu'avec l'interface mais pas avec un script.

Mon script est:

$query = "SHOW TABLES ";
$res_a = mysql_query($query, $dbLink) or die (mysql_error());
$nb_rep_a = mysql_num_rows($res_a);

while ($line = mysql_fetch_assoc($res_a)) {
foreach ($line as $col_value) {
echo "$col_value<br>n";
}
}

C'est comme si phpmyadmin avait créé une version fantôme de ma
base de données...


Denis
Avatar
Frederic BISSON
Est-ce que quelqu'un pourrait passer ceci par exemple ?
14; commande pour effacer la table
alors que je m'attends à lire un nombre et rien d'autres ?
En HTML, tu n'as pas possibilité de préciser qu'un champ d'un formulaire

est numérique. Il ne contient que du texte (avec JavaScript, c'est une
autre histoire). Mais en dehors d'HTML, rien n'empêche quelqu'un de
générer une requête HTTP parfaitement standard et te fournir n'importe
quelle valeur.

En fait, si l'argument est bon, j'affiche les détails d'un volume
et sinon, c'est la liste des volumes et il faudra choisir un volume
parmi la liste.
Selon php.net :

mysql_query() retourne une ressource de résultat MySQL, ou bien FALSE si
la requête n'a pu être exécuté correctement

Si aucune valeur n'a été trouvée, mysql_query() retourne une ressource
de résultat parfaitement valide mais vide. Tu ne peux pas te baser sur
$res pour déterminer que mysql_query() a trouvé des enregistrements ou
non.

@+

Frédéric

Avatar
Denis Beauregard
Le 17 Jul 2004 09:21:54 GMT, Denis Beauregard
écrivait dans fr.comp.lang.php:

Bonjour,

Mon cas se complique !

C'est comme si phpmyadmin avait créé une version fantôme de ma
base de données...


Cas résolu !!! La base a été transférée vers un autre serveur
et j'éditais l'ancienne base mais lançais les scripts sur la nouvelle.

Merci tout de même pour les conseils pour une meilleure programmation.


Denis