Double requete SQL : merci d'aporter une solution magique svp ;)

Répondre
olivier88888
le 12/09/2007 à 12:58
olivier88888
Bonjour,
j'ai repris une solution de Marjosin et je l'ai adapte' a ma base de donne'es. Je l'ai trafique'e afin de n'avoir que la ligne qui m'interesse afin d'optimiser la chose. Donc j'ai une requete qui marche (teste'e dans phpmyadmin) et qui est la suivante:

SET @pos :=0;
SET @last := NULL;
SELECT * FROM (SELECT fx_leverage, fx_company_name, fx_id,IF( @last = fx_leverage, @pos := @pos , @pos := @pos +1 ) AS position, @last := fx_leverage FROM `fx_data` ORDER BY `fx_leverage` +1 DESC) as result WHERE `fx_id` = 18


Je fais un mysqli_real_connect() de tout la bazard et ca me donne :

Fatal error: Call to a member function fetch_assoc() on a non-object in .... at line 22 (-qui est la ligne en question... bien sur-)

Alors je lis plein de solution avec des next requetes etc mais je suis pas super motive's pour les appliquer parce que j'ai mis une semaine a creer une class qui me gere ma base de donne'es sans probleme (parce que j'utilise tout en japonais, bonjour les problemes...).

Si jamais je separe les SET du reste de la requete ca me dit "Commands out of sync; you can't run this command now" ... ce qui ne m'avance pas des masses non plus.

J'utilise PHP5 et MYSQL 5.0.37.

En gros ma question est simple: c'est quoi la solution magique?

...Sachant que ca peut aller du on ajoute une petite ligne de code apres un truc, ---- a on modifie un peut la requete pour tout faire tenir en une requete qui reste optimise'e, ----a "t'as tout juste oublie' d'ecrire #dksfjldf# apres #oqpirp#. ...

Merci d'avance pour votre aide et j'attends avec impatience vos reponses (je sais pas continuer sans enfait ;)

Olivier
Olivier
LupusMic
le 12/09/2007 à 20:00
LupusMic
Ma boule de cristal est en panne.

Comment veux-tu qu'on t'aide si tu ne mets pas le code PHP qui plante ? En simplifié ?

Parce que bon, je peux pas deviner :
- si tu as compilé avec mysqli
- si tu as la bonne bibliothèque MySQL d'installée sur la machine cliente
- si tu as testé le retour de mysqli_real_connect
- si tu as bien fait tes appels avec les fonctions de requêtes multiples
- et plein d'autres choses

Si le code est proprio, ben va falloir faire preuve de courage, et réviser tout ton code.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
olivier88888
le 13/09/2007 à 02:27
olivier88888
Merci pour l'interet que tu portes a ma question.

Mon code ca ressemble a ca:
<?php
$query_firm = $db->query("SET @pos :=0,SET @last := NULL;SELECT * FROM (,SELECT fx_leverage, fx_company_name, fx_id,IF( @last = fx_leverage, @pos := @pos , @pos := @pos +1 ) AS position, @last := fx_leverage FROM `fx_data` ORDER BY `fx_leverage` +1 DESC) as result WHERE `fx_id` = 18");
$data_firm = $query_firm->fetch_assoc();
echo "<br>This is the position for leverage of firm #18 : ".$data_firm['position']."<br>";
?>

Et une partie de ma Class ressemble a ca:
<?php
class Database_Connection
{
public function query($sql)
{
$this->ensure_db_connection();
$res = $this->db->query($sql)
or report_error("Error while processing the request.", "Bad SQL statement: $sql<br><br>" . $this->db->error, true);
return $res;
}
public function __get($var)
{
if ($var == "affected_rows")
{
$this->ensure_db_connection();
return $this->db->affected_rows;
}
}
private $db;
private $connected;

private function connect()
{
mysqli_real_connect($this->db, CONFIG_DB_SERVER, CONFIG_DB_USER, CONFIG_DB_PASSWORD, CONFIG_DB_NAME)
or report_error("Unable to connect to the database", mysqli_connect_error(), true);
$this->db->query('SET NAMES utf8')
or report_error("Unable to connect to the database", "Impossible to change character encoding", true);
}

public function ensure_db_connection()
{
if (! $this->connected)
{
$this->connect();
$this->connected = true;
}
}

}
?>


Et j'ai cre'e ma class tout seul comme un grand :) juste que je pensais pas avoir besoin d'un truc a connection multiple.

Merci d'avance pour ton aide,

Olivier
Olivier
LupusMic
le 13/09/2007 à 04:00
LupusMic
Bon, comme ça c'est mieux ;) Surtout que je n'avais pas fait la connexion avec le précédent fil de discussion.

La solution proposée par mojorisin est composée de plusieurs requêtes. L'extension MySQL de PHP ne supportait pas les multi-requêtes. Elles sont supportées avec MySQLi. Mais, il faut utiliser les méthodes qui vont bien. À savoir commencer par utiliser MySQLi::multi_query, qui permet de gérer les requêtes multiples. Sinon, point de salut pour toi.

Dans le cas présent, du essaye de faire un query simple sur la requête multiple. Après analyse de la requête multiple, elle va être déclarée comme invalide, et ne pourra pas être traitée. C'est pourquoi la ressource renvoyée est nulle, et que ton fetch_array ne peut être appelé sur un non-objet.

Je ne peut que t'encourager à encapsuler ton code, mais avant de faire ça, fait des tests simples, dans des fichiers indépendants. Ça te permettra de tester. De plus, pour vraiment obtenir des classes qui tiennent la route, il faut un peu de bouteille. Et je n'ai pas cette prétention après quelques années de programmation (éparses, certes).

Je me suis fait un exemple de multi-query, si ça intéresse, je peux le mettre à disposition.
Développeur récurrent, procédural et relationnel. Caustique soupe-au-lait.
Répondre

Ecrire un message

Votre message vient d'être créé avec succès.
LoadingChargement en cours