Se connecter / S'enregistrer

Résolu Erreur sur un script php

Solutions (10)
Tags :
  • Php
  • Undefined
  • Script
  • Programmation
|
Bonsoir,
J'ai cherché à droite, à gauche des informations qui me permettrainet de résoudre ce petit problème.
Alors voilà, par le biais d'un bouton "remise à zéro", je souhaite supprimer dans une table "nouvelaherent" tous les enregistrements sauf le dernier. N'ayant rien trouvé, je me dirige vers la réalisation d'une itération qui me supprimerait les enregistrements de ma table sauf le dernier.
Lorsque je lance mon script, je reçois le message d'erreur suivant:
Notice: Use of undefined constant rows - assumed 'rows' in D:\Site-Association\Templates\supprimer_na.php on line 29

Notice: Undefined variable: nb in D:\Site-Association\Templates\supprimer_na.php on line 29

Voic mon script:
<?php require_once('Connections/Connect.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

mysql_select_db($database_Connect, $Connect);
// définition de la requête
$requete = "select * from nouveladherent ORDER BY 'num'";
// envoi de la requête
$result = mysql_query($requete);
while($row = mysql_fetch_assoc($result)) {
// lecture en boucle de tous les enregistrements
}

// Se positionner maintenant sur le dernier enregistrement
$nb_rows = mysql_num_rows($result);
mysql_data_seek($result, $nb-rows - 1); //on se positionne sur le dernier
$row = mysql_fetch_assoc($result); // il faut le relire
$der = $row["num"];

// se repositionner sur le premier enregistrement
mysql_data_seek($result, 0);
$row = mysql_fetch_assoc($result); // il faut le relire
$prem = $row["num"];

for($i=$prem; $i < $der-1; $i++) {
$reqsup = mysql_query("DELETE FROM nouveladherent where num=$i");
}

?>
La ligne 29 est la suivante: mysql_data_seek($result, $nb-rows - 1); //on se positionne sur le dernier
Merci pour vos réponses.
Cordialement
Contenus similaires
Meilleure solution
partage
|
2) En ce qui concerne le $enr[0][0] récupère le champs 0 de la ligne 0 contenu dans un tableau qui est le résultat de la requête.
Enfin le premier crochet sert pas à rien car on à déjà lu une ligne avec le "$enr = mysql_fetch_array($result)"
(met pour ma part j'ai testé sa marché quand même.)

1) J'ai créer une table et testé voici le code que j'ai fais pour ma part il fonctionne très bien (j'ai essayé de commenter j'espère que sa sera assez clair):

//Requete 1 Select du dernier adherent
$rqt = "select MAX(num) as dernierNum from nouveladherent";
//Execution de la requete et recuperation d'un curseur
$res = mysql_query($rqt);
//Lecture du curseur (tableau) qui contient normalement 1 ligne et 1 colonne
$enr = mysql_fetch_array($res); //ici on lit la ligne 1
$num = $enr[0]; //On récupère la valeur de la colonne 0 de la ligne 1 notre max(num) ou alors tu fais $num = $enr["dernierNum"]; c'est pareil

//rqt Delete
$rqt = "DELETE FROM nouveladherent WHERE num <> ".$num;
mysql_query($rqt);//execution de la requête

En espérant que sa marche pour vous!
  • Commenter cette solution |
Score
0
òh
òi
|
Bonsoir damino80,
Désolé mais vous m'avez précédé pour la réponse .
Alors j'ai travaillé sur votre proposition et j'ai modifié la ligne qui se situe juste après // ici:
---------------------------------------------------------------
mysql_select_db($database_Connect, $Connect);
// définition de la requête

$requete = "select MAX(num) as derniernum from nouveladherent ORDER BY 'num' ASC";
// envoi de la requête
$result = mysql_query($requete);
$enr = mysql_fetch_array($result);

$num = $enr[0];
// ici
$reqsup = "DELETE FROM nouveladherent where num<>$num";
mysql_query($reqsup);
Et ça marche !!!!!!!!!!!!
J'ai effectivement afficché par des echo ma variable $num qui ne me fournissait pas le bon résultat.
Je tiens particulièrement à vous remercier pour votre gentillesse et votre patience.
Merci encore et bonne soirée. Le script est résolu.
Cordialement
  • Commenter cette réponse |
Score
0
òh
òi
|
Avez-vous essayer d'afficher la requête DELETE et de la copier dans mysql voir si le résultat et le même parce que la j'ai du mal a comprendre.

La clé primaire est un bien de type INT ?

Votre version de mysql accepte tel les procédure stockée car sa simplifiera le traitement et puis en ce qui concerne la performance on sera au top !

On va bien trouver une solution !
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonsoir Damino80,
Désolé mais la rectification ne m'apporte pas de résultat positif. Il ya toujours la suppression de tous les enregistrements et ce n'est pas le résultat que j'attends.
Merci quand même.
Cordialement
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour,
---------------------
Pour Damino80:
1) j'ai réalisé vos préconisations et cela fonctionne mais la requête me supprime tous les enregistrements de ma table "nouveladherent" et ce n'est pas ce que je recherche puisque je veux conserver le dernier enregistrement de la table.
J'avais réalisé cette manipulation de suppression totale au début avec la requête suivante: "DELETE * FROM nouveladherent qui est plus légère et plus simple mais encore une fois ce n'est pas ce que je recherche.
2) Expliquez moi ceci: $num = $enr[0][0]; je ne saisis pas bien.
Merci tout de même.
Cordialement
  • Commenter cette réponse |
Score
0
òh
òi
|
Damino80 a dit :
$rqtDelete = "DELETE FROM nouveladhrent WHERE num NOT IN (".$num.")");
mysql_query($rqtDelete);

Le NOT IN est beaucoup plus lourd qu'un simple <> lorsqu'on ne cherche qu'une valeur.

Concernant la première requète donnée par damino80, elle provoque une erreur très particulière: on ne peut pas faire de sous-requète qui modifie la même table.
Autant on peut faire:
  1. SELECT * FROM nouveladherent WHERE num<>(SELECT MAX(num) FROM nouveladherent)

Autant les deux requètes suivantes feront une erreur:
  1. DELETE FROM nouveladherent WHERE num<>(SELECT MAX(num) FROM nouveladherent)
  2. UPDATE nouveladherent SET actif=0 WHERE num<>(SELECT MAX(num) FROM nouveladherent)
  • Commenter cette réponse |
Score
0
òh
òi
|
Re !

Je suis pas un pro du php mais je pense que tu devrait t'orienté vers quelque chose de moins lourd, je m'explique:
Tu fais une boucle qui va faire n suppression dans ta base donc n appelle au serveur faut pas oublié qu'on est en web sa me parait un peu lourd pour le traitement souhaités.

J'ai regardé pour ma requête en effet sur certaine version de mysql les sous select ne fonctionne pas !
En remplacement je te propose 2 appels:

$rqtSelect = "SELECT MAX(num) FROM nouveladherent";
$result = mysql_query($rqtSelect);
$enr = mysql_fetch_array($result);
$num = $enr[0][0];

$rqtDelete = "DELETE FROM nouveladhrent WHERE num NOT IN (".$num.")");
mysql_query($rqtDelete);

Je ferais un truc un peu comme sa avec des test d'erreur ect...

Voila j'espere que sa pourra t'aider !
  • Commenter cette réponse |
Score
0
òh
òi
|
Bonjour,
Merci à vous deux d'avoir pris la peine de consacrer de votre précieux temps sur ce petit problème.
La requête de damino80 ne fonctionne pas dans mon script.
Alors j'ai écouté les conseils de Sim07 qui déjà, me précisait que mon script devait marcher.
J'ai entrepris la modification à la ligne 26, j'ai changé l'affectation de la variable $nb_rows comme ceci: $nb_rows = mysql_num_rows($result) - 1; pour être en phase avec Sim07. Plus d'erreur mais je n'arrive pas à comprendre pourquoi il me supprime que le premier enregistrement alors que je lui demande de répéter la suppression par la boucle for($i=$prem; $i<$der; $i++) ...
Dois-je m'orienter sur une autre piste (genre while ...) mais ma boucle devrait tout de même fonctionner.
----------------------------------------------------------------
<?php require_once('Connections/Connect.php'); ?>
<?php
if (!function_exists("GetSQLValueString")) {
function GetSQLValueString($theValue, $theType, $theDefinedValue = "", $theNotDefinedValue = "")
{
if (PHP_VERSION < 6) {
$theValue = get_magic_quotes_gpc() ? stripslashes($theValue) : $theValue;
}
$theValue = function_exists("mysql_real_escape_string") ? mysql_real_escape_string($theValue) : mysql_escape_string($theValue);
}
}

$editFormAction = $_SERVER['PHP_SELF'];
if (isset($_SERVER['QUERY_STRING'])) {
$editFormAction .= "?" . htmlentities($_SERVER['QUERY_STRING']);
}

mysql_select_db($database_Connect, $Connect);
// définition de la requête
$requete = "select * from nouveladherent ORDER BY 'num'";
// envoi de la requête
$result = mysql_query($requete);
while($row = mysql_fetch_assoc($result)) {
// lecture en boucle de tous les enregistrements
}
$nb_rows = mysql_num_rows($result) - 1;
mysql_data_seek($result, $nb_rows); //on se positionne sur le dernier
$row = mysql_fetch_assoc($result); // il faut le relire
$der = $row["num"];

// se repositionner sur le premier enregistrement
mysql_data_seek($result, 0);
$row = mysql_fetch_assoc($result); // il faut le relire
$prem = $row["num"];

// tant qu'il y a un enregistrement, les instructions dans la boucle s'exécutent

for($i=$prem; $i<$der; $i++) {
$reqsup = mysql_query("DELETE FROM nouveladherent where num=$i");
}

?>
Merci à tous.
Cordialement
  • Commenter cette réponse |
Score
0
òh
òi
, Ex-AdMiN |
Alors la réponse est très simple. Il n'y a pas d'erreur ! Il a beau être 1h06, je vais même l'assurer et le répéter 2 fois, ce script est bon (mais pas parfait).

Bon avant de me coucher je vais expliquer quelques trucs.

En PHP il y a plusieurs niveaux d'erreurs qui affiche plus ou moins de message d'erreur.

On a par exemple les E_PARSE ou erreur de syntaxe qui coupe le script avant même son exécution. E_FATAL qui est une grosse erreur impliquant un arrêt immédiat. E_WARNING qui est une très grosse erreur également mais que l'on peut gérer et terminer l'exécution. EN tout cas l'exécution se termine (ou tombe plus tard sur une E_FATAL ...).

Le plus souvent, et PHP par défaut l'est, il n'affiche que ses erreurs et pourtant on peut également en avoir plus pour des erreurs genre :

  1. <?php
  2. function myFunction($toto) {
  3. echo $toto." ".$tata;
  4. }
  5. ?>


Essayer, sur un WAMP par défaut à priori il n'y aura aucun message d'erreur et $tata sera vide. Pourtant une erreur de type E_NOTICE peut être lancé si on l'active. C'est une très bonne pratique au passage pour développer puisque cela chasse des erreurs souvent d'inattention. Mais ce n'est pas toujours facile.

Sinon la solution est de ne pas activer ses erreurs. Au passage, sur un serveur public, aucune erreur ne devrait être affiché !

Soit on accède à la configuration du serveur soit on utilise la fonction error_reporting().

Par exemple, si on fait un petit code genre :

  1. $myIp = getMyIP(); //retourne $_SERVER['REMOTE_ADDR'] ou un truc du genre + vérif sécu
  2. if($myIp == '127.0.0.1') error_reporting(E_ALL ^ E_NOTICE);
  3. else error_reporting(0);


Et voilà, lorsque vous appellerez votre code en local vous aurez des messages d'erreurs mais plus lorsque votre site sera chez un hébergeur. (si vous avez un serveur à vous, alors activez les logs d'erreur !) Ne plus afficher les messages d'erreurs est une bonne mesure de prévention pour la sécurité, en revanche c'est parfois galère de comprendre pourquoi on a une page blanche ...

Actuellement et pour en revenir au problème, le message d'erreur est affiché car soit la configuration PHP équivaut, soit error_reporting() est à E_ALL et non E_ALL ^ E_NOTICE comme pour exemple.


Et voilà !

PS : Aucun problème sur la requête SQL à priori, et même si elle ne marchait pas, vu ton code tu n'aurais absolument aucun message d'erreur ! Il faudrait faire un :
  1. if(!reqsup) {
  2. trigger_error("Erreur dans la requête SQL !", E_USER_ERROR);
  3. }

Avec mon code d'au dessus, tu n'auras un message que en local et rien en prod. Contrairement à l'horrible solution de trop nombreux tuto du "or die".

PPS :
Bon par contre ton message d'erreur sur une ligne ou tu as une pseudo faute de syntaxe. On ne peut pas avoir de - dans le nom d'une variable. $nb-rows correspond donc à faire la soustraction d'une constante non défini dans le nom serait rows à la variable $nb
  • Commenter cette réponse |
Score
0
òh
òi
|
Salut sa me parait un peu prise de tête ton code, je te propose donc une sous requête pour résoudre ton problème

DELETE FROM nouveladherent WHERE clePrimaire NOT IN (SELECT MAX(clePrimaire) FROM nouveladherent)

Sa marche avec des clé primaire de type entier.
  • Commenter cette réponse |

Ce n'est pas ce que vous cherchiez ?

Tom's guide dans le monde
  • Allemagne
  • Italie
  • Irlande
  • Royaume Uni
  • Etats Unis
Suivre Tom's Guide
Inscrivez-vous à la Newsletter
  • ajouter à twitter
  • ajouter à facebook
  • ajouter un flux RSS