Rechercher : dans
Par :

Parcours d'une table sur mysql

Dernière réponse le 12 déc 2008 à 12:47:18 baabs12, le 11 déc 2008 à 11:13:46 
 Signaler ce message aux modérateurs

Bonjour,
J'aimerai savoir comment peut on faire le parcours d'une table sur Mysql sans utiliser la fonction mysql_fetch_array?
Je programme avec PHP.

Merci d'avance

Configuration: Windows XP
Firefox 3.0.4

Meilleures réponses pour « Parcours d'une table sur mysql » dans :
MySQL – Optimisation VoirL’optimisation au niveau de MySQL passe par trois composants, à savoir : Optimisation du serveur MySQL Optimisation de la base de données Optimisation des requêtes Optimisation de la configuration de serveur MySQL L’optimisation du serveur peut...
SQL - Modification de table VoirModification de table Il est possible de supprimer une table grâce à la clause DROP, il existe aussi des commandes moins extrêmes permettant L'ajout de colonnes La modification de colonnes La suppression de colonnes Enfin, il est possible...
SQL - Création de table VoirLe SQL, comportant un langage de définition de données (LDD), permet de créer des tables. Pour cela, il utilise le couple de mots clés CREATE TABLE. La création de tables Le création de tables se fait à l'aide du couple de mots-clés CREATE...
Administration de MySQL VoirLa base de données mysql Les Système de Gestion de Bases de Données tels que MySQL permettent de manipuler facilement et avec beaucoup de souplesse un très important volume de données. Toutefois, aussi robuste soit MySQL, il peut être intéressant...

1

Brydjy, le 11 déc 2008 à 11:16:11

Pourquoi ne veux tu pas utiliser MySQL_fetch_array ?
tu as 'MySQL_fetch_object' aussi.

Répondre à Brydjy

3

baabs12, le 11 déc 2008 à 11:20:34

Parce que j'ai une erreur du genre :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­hp on line 257

au fait c'est parce que je veux transferer des données d'une table se trouvant dans une base de Sql Server vers une autre table qui est sur Mysql

Répondre à baabs12

5

Brydjy, le 11 déc 2008 à 11:26:16

Sur le lien fourni ci-dessous, tu trouveras probablement ta réponse.
Un peu de lecture, il en faut.
Aller bon courage.

Répondre à Brydjy

2

Revan26914, le 11 déc 2008 à 11:18:26

Bonjour,

Il y aussi plein d'autres méthodes ==> http://www.manuelphp.com/php/function.mysql-fetch-array.php



Cordialement

Revan
There are 10 types of people in the world: those who understand binary and those who don't.

Répondre à Revan26914

4

Brydjy, le 11 déc 2008 à 11:20:43

Oui c'est vrai.

Répondre à Brydjy

6

baabs12, le 11 déc 2008 à 11:31:13

Merci à vous deux. Sachez cependant que j'ai déjà appliqué toutes les méthodes de cette page. Effectivement depuis le weekend passé j'y travaille et j'ai tjrs le meme message d'erreur.
Je pense que la solution est de faire une boucle pour parcourir la table, ce qui est dommage est que : je ne sais pas comment le faire et c'est ce que je demande.
Encore une fois merci

Répondre à baabs12

7

Brydjy, le 11 déc 2008 à 11:33:03

Pour faire une boucle ?
Tu utilise 'WHILE'

Tu veux afficher les résultats, Vérifier, comparer ?

Répondre à Brydjy

8

baabs12, le 11 déc 2008 à 11:37:18

Je veux en étant sur Mysql me connecter sur une table de Sql server, y récupérer des données et les insérer dans une table qui est sur Mysql.
Ci dessous la fonction que j'ai écrite:

function transfert()
{
$myServer = "JOB";
$myUser = "root";
$myPass = "*****";
$myDB = "pi";

// connexion sur la base promo (sql server)
$dbhandle = mssql_connect($myServer, $myUser, $myPass)
or die("Connexion impossible sur le serveur $myServer");

// selection de la base de données (sql server)
$selected = mssql_select_db($myDB, $dbhandle)
or die("Ouverture impossible de la base $myDB");

echo "Vous etes bien connectes sur la base" . $myDB . " du" . $myServer . ".";

//requête SQL pour extraire le montant sur sql server
$reponse = mssql_query("SELECT * FROM F_DOCENTETE,F_CREGLEMENT WHERE F_DOCENTETE.CT_NumPayeur = F_CREGLEMENT.CT_NumPayeur");

while ($donnees = mssql_fetch_array($reponse) )
{

$db_porteur =& P4A_DB::singleton();//(La table porteur se trouve sur mysql)
$crit_porteur = $db_porteur->queryRow("SELECT * FROM porteur "); // Requête SQL


// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)

while ($donneesporteur = mysql_fetch_array($crit_porteur) )
{
$nb_porteur = $donneesporteur['numero_compte1'];
$val = $donnees['RG_Montant'] ;
$num = $donnees['CG_Num'] ;

if ($nb_porteur = $num)
{
$db_pt1 =& P4A_DB::singleton();
$crit_pt1 = $db_pt1->queryRow("insert into testpromo (field4, field5) values ('$val', '$val')"); //(table testpromo sur Mysql)
}
}




}

// close the connection
mssql_close($dbhandle);




}








Et ma connexion sur Mysql est faite comme suit:

<?php

/**

*/
define("P4A_EXTENDED_ERRORS", true);
define("P4A_DSN", 'mysql://root:*****@localhost:3306/bw');

require_once( dirname(__FILE__) . '/../../p4a.php' );

$app =& p4a::singleton("p4a_base_application");
$app->main();

?>


Répondre à baabs12

10

Brydjy, le 11 déc 2008 à 11:40:48

:)

Bah étant donné que tu as l'air plus calé que moi.
je vais attendre les réponses... avec toi.

Répondre à Brydjy

11

baabs12, le 11 déc 2008 à 11:44:38

Je ne suis pas du tout plus calé que toi, loin de là d'ailleurs. Je veux juste trouver une solution à mon problème et demande de l'aide au forumiste! Après tout nous somme tous de la mm famille

Répondre à baabs12

12

Brydjy, le 11 déc 2008 à 11:45:53

Oui lol.
(c'était pas une réflexion ? ... on est d'accord ?)
Mais c'est vrai que le dév et SQL ça va super loin.
Moi ça m'impressionne.

Répondre à Brydjy

9

Marco la baraque, le 11 déc 2008 à 11:40:46

Bonjour,

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­­hp on line 257

Si tu as ce message d'erreur, c'est en général que ta requête ne s'est pas bien déroulée. Regarde du côté de mysql_errno() pour savoir ce qui s'est passé.
Une fois que tu auras résolu ce problème, mysql_fetch_array() fonctionnera sans problème.

Bien cordialement, rtfm and jfgi

Répondre à Marco la baraque

13

NothingAtALL, le 11 déc 2008 à 11:58:33

Premierement.... il est préférable d'utiliser mysql_fetch_assoc plutot que mysql_fetch_array...!
Je ne comprend toujours pas pourquoi il y a encore des gens qui utilise mysql_fetch_array, cette fonction crée un tableau deux fois plus gros! Utilisation d'espace inutile!

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­­­hp on line 257

ce message d'erreur est effectivement en rapport avec une mauvaise exécution de ta requête!
mais je voudrais corriger ce que Marco vient de te dire!
Car tu utilises mssql et non mysql et mysql_errno ne te sera donc pas très utile!
Il faut plutot utiliser mssql_get_last_message

exemple
mssql_query("SELECT * FROM table") or die(mssql_get_last_message());

pour t'assurer que ta requete est bonne, je ne sais pas exactement quelle application tu utilises pour ta connexion a la bd -> comme PHPMyAdmin pour MySQL mais il y a habituellement un endroit que tu peux faire une requete directement sur la bd et ca sera plus facile de voir l'erreur!

Répondre à NothingAtALL

14

NothingAtALL, le 11 déc 2008 à 11:59:59

Je voulais dire mssql_fetch_assoc plutot que mysql_fetch_assoc et meme chose pour mysql_fetch_array dans le premier paragraphe!

Répondre à NothingAtALL

15

Marco la baraque, le 11 déc 2008 à 12:10:02

Bonjour NothingAtALL,
Baabs12 utilise à la fois une BD MySQL et une MsSql, donc le problème peut venir des deux BD.

@Baabs12 :
A mon avis le problème vient de la ligne suivante :

$crit_porteur = $db_porteur->queryRow("SELECT * FROM porteur ");


Après exécution, vérifie bien que $crit_porteur est de type resource (je ne sais pas dans quelle base queryRow s'exécute, donc utilise la fonction de vérification d'erreur qui va bien).

EDIT : je voulais dire "vérifie bien que $crit_porteur est de type ARRAY", désolé

Cordialement, rtfm and jfgi

Répondre à Marco la baraque

17

baabs12, le 11 déc 2008 à 12:23:16

J'utilise queryRow() pour interroger la base Mysql car si j'utilise mysql_query, j'ai les message d'erreur suivants:

Warning: mysql_query() [function.mysql-query]: Accès refusé pour l'utilisateur: 'ODBC'@'@localhost' (mot de passe: NON) in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­hp on line 264

Warning: mysql_query() [function.mysql-query]: A link to the server could not be established in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­hp on line 264



Le résultat avec queryRow est un array et non un resource

Répondre à baabs12

18

Marco la baraque, le 11 déc 2008 à 12:52:00

Bonjour,
Peut-on connaître l'implémentation de queryRow()? C'est une méthode que tu as écrite? Que tu as trouvée où?

Le plus simple à mon avis c'est de te créer l'utilisateur ODBC@localhost dans la table users afin d'avoir les droits en lecture : http://dev.mysql.com/doc/refman/5.0/fr/adding-users.html
De cette manière tu pourras utiliser mysql_query puis mysql_fetch_array (apparemment le tableau retourné par queryRow n'est pas bien pris en compte par mysql_fetch_array, il doit manquer des informations dedans qui ne te sont pas importantes mais pour mysql_fetch_array si).

Cordialement, rtfm and jfgi

Répondre à Marco la baraque

19

baabs12, le 11 déc 2008 à 13:34:40

Avec queryRow j'interroge la base mysql sans l'utilisateur ODBC.
maintenat j'ai créer l'utilisateur ODBC et la fonction mysql_query. à ma grande surprise rien n'est affiché!



$reponse = mysql_query("SELECT * FROM porteur ");
		echo $reponse;

Répondre à baabs12

20

baabs12, le 11 déc 2008 à 16:54:27

Salut,
j'ai pu faire le parcours de la table avec une boucle for. je vous montre la fonction pour une éventuelle amélioration.

functionTransfert()
	{
	
	
		$myServer = "JOB";
		$myUser = "root";
		$myPass = "*****";
		$myDB = "pi";

// connexion sur la base testsql (sql server)
		$dbhandle = mssql_connect($myServer, $myUser, $myPass)
    		or die("Connexion impossible sur le serveur $myServer");

// selection de la base de données (sql server)
		$selected = mssql_select_db($myDB, $dbhandle)
    		or die("Ouverture impossible de la base  $myDB");
		
//requête SQL pour extraire le montant	au niveau des tables sur sql server

	
 		$reponse = mssql_query("SELECT * FROM F_DOCENTETE,F_CREGLEMENT WHERE F_DOCENTETE.CT_NumPayeur = F_CREGLEMENT.CT_NumPayeur");
			
 		while ($donnees = mssql_fetch_array($reponse) )
				{
								
						$db_porteur =& P4A_DB::singleton();
						$db_porteur1 =& P4A_DB::singleton();

						$crit_porteur = $db_porteur->queryRow("SELECT * FROM porteur ORDER BY numero DESC LIMIT 1");// Récupération du dernier id
						
		
 					
// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)
						
						 for ($i=$crit_porteur['numero']; $i>=1;$i--)
							{
								$crit_porteur1 = $db_porteur1->queryRow("SELECT * FROM porteur WHERE numero= $i ");// Requête SQL

							$nb_porteur = $crit_porteur1['numero_compte1'];

							if(!$nb_porteur) // je veux ne pas traiter les cas où $nb_porteur est null.
								  {
								    
									$val = $donnees['RG_Montant'] ;
	                   			    $num = $donnees['CG_Num'] ;
								    $date1 = $donnees['RG_Date'];
								 
					 
									if ($nb_porteur = $num)
									  {
				   		     			$db_pt1 =& P4A_DB::singleton();
				    					$crit_pt1 = $db_pt1->queryRow("insert into testpromo (field4, field5, field7) values ('$val', '$val','$date1')"); //(table testpromo sur Mysql)
									  }
								  }  
							}			
		

						
				}

// close the connection
		mssql_close($dbhandle);


	}
	



Merci bcp pour votre aide

Répondre à baabs12

21

Marco la baraque, le 11 déc 2008 à 17:05:46

Bonsoir,
Si ton code fonctionne, on peut effectivement l'améliorer légèrement :

$crit_porteur = $db_porteur->queryRow("SELECT * FROM porteur");
//si on peut éviter de trier, autant le faire c'est toujours des ressources de gagnées
						
		
 					
// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)
for ($i=0; $i<count($crit_porteur);$i++) {
	$crit_porteur1 = $db_porteur1->queryRow("SELECT * FROM porteur WHERE numero=".$crit_porteur[$i]);
        $nb_porteur = $crit_porteur1['numero_compte1'];
...


Le problème est qu'ici ce n'est pas encore totalement optimisé, parce qu'on fait 2 requêtes. Je pense que dans ton cas on peut tout faire en une seule :
$num_porteur = $db_porteur->queryRow("SELECT numero_compte1 FROM porteur");
//si on peut éviter de trier, autant le faire c'est toujours des ressources de gagnées
				
// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)
for ($i=0; $i<count($num_porteur);$i++) {
	 $nb_porteur = $num_porteur[$i];
...


Dis nous si ça fonctionne.

Cordialement, rtfm and jfgi

Répondre à Marco la baraque

22

baabs12, le 11 déc 2008 à 17:51:35

Salut,
le code fonctionne. Il y'a quand même une petite imperfection. En effet si par exemple le numero 100 n'esiste pas on a le notice suivant:

Notice: Undefined index: numero_compte1 in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­hp on line 270

Répondre à baabs12

23

Marco la baraque, le 11 déc 2008 à 18:02:02

Ca c'est assez étrange, normalement on ne devrait pas avoir de problème.
Ta ligne 270 c'est laquelle ?

Cordialement, rtfm and jfgi

Répondre à Marco la baraque

24

baabs12, le 11 déc 2008 à 18:19:53

C'est celle qui me permet de recupérer le resultat de $db_critp


for ($i=1; $i<=$crit_porteur['numero'];$i++)
							{
							
								$crit_porteur1 = $db_porteur1->queryRow("SELECT * FROM porteur WHERE numero = $i");// Requête SQL
								

$nb_porteur = $crit_porteur1['numero_compte1'];// ligne 270

								    $val = $donnees['RG_Montant'] ;
	                   			    $num = $donnees['CG_Num'] ;
								    $date1 = $donnees['RG_Date'];
								 					 
									if ($nb_porteur = $num)
									  {
				   		     			$db_pt1 =& P4A_DB::singleton();
				    					$crit_pt1 = $db_pt1->queryRow("insert into testpromo (field4, field5, field7) values ('$val', '$val','$date1')"); //(table testpromo sur Mysql)
									  }

								   
							}			



Répondre à baabs12

25

Marco la baraque, le 11 déc 2008 à 18:28:03

La deuxième méthode que je t'ai donnée ne fonctionne pas? Elle est mieux car elle ne requiert qu'une seule requête :

...
$num_porteur = $db_porteur->queryRow("SELECT numero_compte1 FROM porteur");
//si on peut éviter de trier, autant le faire c'est toujours des ressources de gagnées
				
// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)
for ($i=0; $i<count($num_porteur);$i++) {
	 $nb_porteur = $num_porteur[$i];
...


Cordialement, rtfm and jfgi

Répondre à Marco la baraque

26

baabs12, le 12 déc 2008 à 10:38:41

Salut,
sacré journée d'hier!
Bon j'ai testé ta méthode mais elle ne fait rien du tout je pense c'est cette partie du code qui pose problème:

for ($i=1; $i<count($num_porteur);$i++) {
	 $nb_porteur = $num_porteur[$i];


De mon coté je cherche comment faire pour ne pas exécuter la requête si le numero n'existe pas.

Répondre à baabs12

27

baabs12, le 12 déc 2008 à 10:50:53

Il y'a également le notice suivant:

Notice: Undefined offset: 1 in C:\Program Files\EasyPHP 2.0b1\www\bytesyss\applications\bo\objects\masks\dem_autor.p­hp on line 274
qui correspond à la partie du code que je t'ai indiqué

Répondre à baabs12

16

baabs12, le 11 déc 2008 à 12:10:53

J'utilise la methode suivante pour la requete:

$db_porteur =& P4A_DB::singleton();//(La table porteur se trouve sur mysql)
$crit_porteur = $db_porteur->queryRow("SELECT * FROM porteur "); // Requête SQL
echo $crit_porteur;


et le résultat que j'ai est un "array".
Et pour récupérer un champs dans la table je fais:


$nb_porteur = $crit_porteur['numero_compte1'];


ce qui me donne la valeur du champs "numero_compte1" dans la table porteur qui est sur Mysql

Répondre à baabs12

28

 baabs12, le 12 déc 2008 à 12:47:18

Chers tous,
Je voudrai vous dire que mon code marche parfaitement maintenant. Je vous remercie encore une fois de l'aide que vous m'avez apporté et de tous les enseignements fournis pour parfaire ce code. Vive la solidarité!
Je vous poste le code final qui marche actuellement.


functionTransfert()
	{
	
	
		$myServer = "JOB";
		$myUser = "root";
		$myPass = "****";
		$myDB = "pi";

// connexion sur la base promo (sql server)
		$dbhandle = mssql_connect($myServer, $myUser, $myPass)
    		or die("Connexion impossible sur le serveur $myServer");

// selection de la base de données (sql server)
		$selected = mssql_select_db($myDB, $dbhandle)
    		or die("Ouverture impossible de la base  $myDB");

//requête SQL pour extraire le montant		
 		$reponse = mssql_query("SELECT * FROM F_DOCENTETE,F_CREGLEMENT WHERE F_DOCENTETE.CT_NumPayeur = F_CREGLEMENT.CT_NumPayeur");
			
 		while ($donnees = mssql_fetch_array($reponse) )
				{
					$db_porteur =& P4A_DB::singleton();
					$crit_porteur = mysql_query("SELECT * FROM porteur");// Requête SQL pour récupérer les données sur la table porteur
					
					
					
// On fait une boucle pour lister tout ce que contient la table porteur (Mysql)
					while($donneesporteur = mysql_fetch_array($crit_porteur)) // mysql_fetch_array() marche. j'avais oublié de mettre $db_porteur =& P4A_DB::singleton() avant la requete.
					{
						$val = $donnees['RG_Montant'] ; // On met le montant dans $val
	                   	$num = $donnees['CG_Num'] ; //On met le numéro du client dans $num
						$date1 = $donnees['RG_Date']; // On met la date dans $date1
						 					 
						if ($nb_porteur = $num) //Si le numéro du client correspond au numéro du porteur
							{
				   		    	$db_pt1 =& P4A_DB::singleton();
				    			$crit_pt1 = $db_pt1->queryRow("insert into testpromo (field4, field5, field7) values ('$val', '$val','$date1')"); //On insére dans la table transaction les données récupérées dans la base sari
							}
					
					
					}

						
				}

// close the connection
		mssql_close($dbhandle);

	}


Répondre à baabs12
Collection CommentÇaMarche.net