PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 Re : Forum Général PHP » Problème de lecture de BDD » 12-12-2016 18:37:55

Bonjour,

Donc la version de php chez free est la 4.4.3-dev

Et PHP 4 ne supporte pas les exceptions, qui ont été introduites en php 5, donc pas de try/catch chez free.

Vous pouvez toujours leur demander si ils ont une version de PHP plus récente à propose, mais il me semble qu'ils n'ont pas mis beaucoup de choix sur les pages perso.

@+

#2 Re : Forum Général PHP » Problème de lecture de BDD » 12-12-2016 18:37:55

Bonjour,

Et PHP lui même ? Il est possible d'avoir cette information avec un script ne contenant que

<?php
phpinfo();
?>

@+

#3 Re : Forum Général PHP » Problème de lecture de BDD » 12-12-2016 18:37:55

Bonjour,

Et la version PHP de free, c'est laquelle ?

@+

#4 Re : Forum Général PHP » [résolu] je cherche a combiner deux tests avec une fonction AND » 11-12-2016 16:03:51

Bonjour,

Le foreach doublé n'est pas une bonne idée, cela va poser plus de problèmes qu'en résoudre.

Faisons "simple" :


$cartClass = hikashop_get('class.cart');
$cart = $cartClass->loadFullCart();
foreach ($cart->products as $product) {
    if (in_array($product->product_id, $match_product2) && in_array($product->product_id, $match_product1)) {
        return true;
    }
}
return false;
 

le && correspond au and (a peu près, le and étant aussi possible d'ailleurs.

Ceci dit, vu le contenu de $match_product2 et de $match_product1, ça ne sera jamais truc, puisque je ne vois pas comment l'id du produit pourrait être dans les deux vu qu'ils sont différents !

Est ce bien un and ? Faut t'il que l'id du produit soit dans les deux $match_.... ou faut t'il qu'il soit dans l'un ou l'autre ? (auquel cas il faudrait remplacer && par || (ou or)).


NB : le mot clé return est utilisé dans une fonction, ce code est il bien dans une fonction ?
@+

#5 Re : Forum Général PHP » Difficulté dans l'affichage d'un tableau » 17-10-2016 08:57:45

Bonjour,

Houlà, j'ai mal au crane d'un coup, entre danger1, Danger1, Danger n°1, on s'y perd un peu hmm

A vue de nez, je dirai que je ne vois que deux choix pour résoudre ce soucis convenablement :

a) regrouper les précisions / propositions dans un seul champs a chaque fois (le champs precision contient alors toutes les precisions du danger n° x, le champs proposition toutes les propositions du danger n° x, etc...). C'est simple, ça ne nécessite pas plusieurs tables, mais c'est un peu moche (il faut mettre les <br> en base de données, ça mélange présentation et données, il est complexe de gérer les modifications, la correspondance précision / proposition si nécessaire).

b) créer d'autres tables pour avoir un modèle de bdd qui tiens la route. Une table dangers, une table precisions, une table propositions, et des champs dans les tables precisions et propositions qui les relient à la table dangers. Au besoin d'autres liaison, un champs pour l'ordre, bref, un vrai modèle quoi smile

@+

#6 Re : Forum Général PHP » update une BDD avec variable » 20-09-2016 11:06:12

tof73 a écrit :

je vais chipoter aussi, mysql n'exécute pas plusieurs requetes qui sont à la suite, à l'inverse d'autre moteur de bdd.

Chipotons alors smile

En l'occurence si, mysql exécute très bien plusieurs requêtes à la suite, le séparateur étant ; un simple test en ligne de commande fonctionne très bien

Par contre il est vrai que les fonctions mysql/mysqli de php ne supportent à priori pas cette syntaxe, mon raccourci était un peu rapide. Reste que les injections SQL sont loin d'être une illusion, il faut s'en protéger....

@+

#7 Re : Forum Général PHP » update une BDD avec variable » 20-09-2016 11:06:12

Bonjour,

Le formulaire étant soumis avec la méthode POST, les informations qu'il contient sont logiquement dans le tableau $_POST.

Ainsi, un echo de $_POST['nom'] devrait te confirmer que celui ci contient le nom que tu veux dans le update.

Attention cependant, ces valeurs viennent de l'utilisateur, il faut donc s'en méfiier et les vérifier / sécuriser. Sinon un petit malin va mettre comme nom un truc du genre moi'; DROP DATABASE....; et paf, y'a plus de bdd !

A noter également que d'un point de vue optimisation, le while n'est pas nécessaire (à priori le select ne retourne qu'un utilisateur, enfin j'espère !), $data = mysqli_fetch_array($Result); serait suffisant, de même que les nombreuses variables créées dans le while ne sont pas nécessaire, on peut directement utiliser le $data, exemple :


<td> <input type="text" name="nom" id="nom" <?php echo 'value ="'.$data['nom'].'"'; ?> placeholder="Nom"   /> </td>
 

Ok, je chipote, mais chipote + chipote + chipote = site plus rapide (surtout si on a ce genre de choses dans un boucle, un simple appel a une fonction sur 2000 ou 3000 tours, ça peut faire des gros morceaux de secondes smile

@+

#8 Re : Forum Général PHP » mysql ou mysqli? » 16-09-2017 15:38:27

Bonjour,

Typiquement cela veut dire que le résultat de la requête n'est pas bon. Il n'y a en effet rien qui vérifie que $resultat soit bien une ressources mysql après la ligne


$resultat=mysql_query($connexion,$requete);
 

Du coup lors de l'appel à la fonction, il est possible que $resultat ne soit pas une ressource mysql, et paf, les warning.

Un truc du genre


$resultat=mysql_query($connexion,$requete);
if($resultat) {
 // Le code de traitement
} else {
 // Le code quand on a une erreur
 echo 'Erreur SQL !'.$requete;
}
 

J'ai déjà une idée du problème qui cause l'erreur SQL, mysql_query attends comme paramètre d'abord la requête et ensuite l'identifiant de connexion (facultatif d'ailleurs) là ou mysqli_query prend les paramètres dans l'autre sens, de mémoire.

@+

#9 Re : Forum Général PHP » Afficher un résultat d'après une liste déroulante » 19-08-2016 23:07:03

Mais dans la requête de filtrage, on ne voit point de fk_id_bar smile


$requete_liste_bar="
    SELECT bar.nom, bar.adresse, bar.telephone, categorie.nom, prix.niveau
    FROM bar, categorie, posseder, prix
    WHERE posseder.fk_id_categorie= $categorie
    AND posseder.fk_id_bar=bar.id_bar
    AND bar.fk_id_prix= prix.id_prix
    ORDER BY bar.nom"
;
 

Devrait donner de meilleurs résultats (en supposant que la colonne id_bar soit bien celle utilisée dans la table bar).

Tant qu'on y est, pour avoir un truc un peu moins violent à lire, on pourrait peut être utiliser des alias pour les tables, ça serait "plus court" (après pour la lisibilité, chacun fait comme il veut) :


$requete_liste_bar="
    SELECT b.nom, b.adresse, b.telephone, c.nom, px.niveau
    FROM bar as b, categorie as c, posseder as po, prix as px
    WHERE po.fk_id_categorie = $categorie
    AND po.fk_id_bar = b.id_bar
    AND b.fk_id_prix = px.id_prix
    ORDER BY bar.nom"
;
 

Ceci dit, là on ne sera pas non plus bon, il manque la liaison avec la table categorie. Peut être quelque chose comme :


$requete_liste_bar="
    SELECT b.nom, b.adresse, b.telephone, c.nom, px.niveau
    FROM bar as b, categorie as c, posseder as po, prix as px
    WHERE po.fk_id_categorie = $categorie
    AND po.fk_id_bar = b.id_bar
    AND po.fk_id_categorie = c.id_categorie
    AND b.fk_id_prix = px.id_prix
    ORDER BY bar.nom"
;
 

Attention, je n'ai pas cherché à faire une requête optimisée ou fiable, après tout, j'ai faim ! smile

@+

#10 Re : Forum Général PHP » Afficher un résultat d'après une liste déroulante » 19-08-2016 23:07:03

Bonjour,

Avant la piste pour la solution, quelques remarques :

- Si possible utiliser plutot les fonctions mysqli_* que mysql_* qui sont maintenant dépréciés (oui le site n'est pas à jour là dessus sad )
- Il est important de vérifier le contenu de $categorie avant de l'utiliser dans une requête SQL, car là ça pourrait être n'importe quoi, y compris une injection visant a supprimer toute la base hmm
- Il doit manquer des guillemets dans le html des options du code du formulaire, mais bon pour tester ça ira smile

Concernant la solution, je pense que cela vient de la requête SQL list_bar, car elle fait appel à 4 tables mais n'en jointe que 3, et encore pas toutes entre elles. Ainsi on a une clause where sur le fk_id_categorie de posseder, mais rien qui ne relie cette table à la table bar. Du coup il n'y a pas limitation sur la sortie de la table bar, et le résultat contient toute la table...

@+

#11 Re : Défouloir » Présentation Ju-st1 » 22-07-2016 12:39:46

@JC: cool, même si je ne me suis pas attaqué au système de mail, je pense que la mise à jour que j'ai faite a résolu le soucis smile

#12 Re : Forum Général PHP » [PHP] - Appliquer un font-family à mon texte généré ? » 21-07-2016 16:08:09

Bonjour,

PHP ne fait pas de mise en forme, c'est le travail des CSS (ou du HTML dans les temps anciens). Cf http://www.phpdebutant.org/article118.php pour se remémorer cela.

La solution n'est donc pas liée à PHP, mais aux CSS / HTML qui sont interprétés par le navigateur.

@+

#13 Re : Défouloir » Présentation Ju-st1 » 22-07-2016 12:39:46

Bonjour,

La communauté s'est calmé ces derniers temps big_smile mais on essaye toujours de répondre aux questions smile

@+

#15 Re : Forum Général PHP » [Formulaire] - Interdire un mot dans mon script php ? » 20-06-2016 14:50:00


$motsInterdits = array("ban1", "ban2", "ban3");
if (in_array($username, $motsInterdits)) {
header("Location: redirection.html");
} else
 

Peut être ? smile

#16 Re : Forum Général PHP » Evolution code version PHP » 15-06-2016 09:40:16

Bonjour,

Réécrire le code n'est pas trop dans l'objectif de ce forum.

Par contre nous pouvons donner des pistes. Dans ce code, il me semble que ce qui est vraiment obsolète, c'est l'utilisation des fonctions mysql, il faudrait utiliser soit les fonctions mysqli, soit PDO.

Au passage, la requête faite n'est pas un modèle de sécurité, en général il vaut mieux selectionner le mot de passe et le comparer dans le code php que dans le requête SQL, pour deux raisons :

- On est jamais certain que deux mots de passe différents ne donneront pas le même MD5, même si c'est très peu probable (le MD5 n'est d'ailleurs plus recommandé, plus assez sur)

- Si quelqu'un trouve le moyen de faire une injection dans la requête, il ne passera pas le test du mot de passe (même si le mieux, c'est de ne pas avoir d'injection !)

@+

#17 Re : Forum Général PHP » [Résolu] url rewriting ajouter .html ? » 13-06-2016 15:02:50

Bonjour,

Je pencherai pour la solution 1, où en tout cas ne surtout pas essayer d'avoir cette réécriture sur les pages avec et sans le . , sinon cela fait le même contenu sur deux pages à l'url différente, donc les moteurs de recherches ne vont pas aimer.

La règle de réécriture


RewriteRule  ^([A-Za-z-]+[A-Za-z-]+)-([0-9]+)\html$ test.html [L]  
 

ne fonctionne pas à cause du \ qui reste devant html. En effet, dans la règle initiale, le \ est là uniquement pour indiquer que le . n'est pas un caractère spécial (valant n'importe quel caractère sauf le point), mais bien un vrai point.

Il faudrait donc utiliser quelque chose comme


RewriteRule  ^([A-Za-z-]+[A-Za-z-]+)-([0-9]+)html$ test.html [L]  
 

mais pas vers la même page que la version avec . , ou alors avec une redirection type 301 (ou 302 je ne sais plus), bref, une redirection du navigateur vers l'url avec le . (ça serai le plus efficace)

@+

#18 Re : Forum Général PHP » [Résolu] Affichage d'un blob a partir d'une base de donnée » 13-06-2016 15:36:58

Bonjour,

Il y a je pense beaucoup à dire hmm

- test2 utilise du PDO pour l'accès à la base de données, liste.php et connexion.php du mysqli, étrange d'avoir deux choix, il faut harmoniser et n'utiliser qu'une seule façon ! (de plus il y a un mysqli_connect dans connexion puis dans liste, ça commence à faire beaucoup)

- liste.php récupère l'id pour son select par un $_GET, hors sauf erreur de ma part, on appelle pas test2.php en donnant un id par l'url, il faudrait donc plutot alimenter $id via $donnees['ID_pick'].

- la requête présente dans liste.php selectionne ID_pick, donc la donnée qu'on lui fourni dans le WHERE, ce qui n'a que peu de sens (à part dans certains usages spécifiques et encore).

- et du coup, on réalise que la requête dans liste.php n'a pas de sens, la donnée est déjà sélectionnée dans la requête faite dans test2 via PDO, puisqu'elle sélectionne tous les champs - au passage c'est "mal" de faire comme ça, cf http://www.phpdebutant.org/article152.php

Il est donc possible de nettement simplifier le code sur cette partie.

Ou alors cette construction imbriquée relève de la mauvaise compréhension d'une autre problématique, celle de l'affichage de l'image car on a finalement que son contenu blob, ce qui mis tel quel dans la page ne fait pas d'image. Il y a alors deux "écoles" :

- Intégrer l'image en tant que src base64 dans le code html directement, simple à faire ici : cf http://www.bellami.fr/encoder-ses-images-en-base64 , mais cela peut vite faire des pages très lourdes, et à chaque rechargement de la page il faudra retransférer tout le html donc le poid des images

- Intégrer les images "à l'ancienne", dans ce cas ce n'est pas un include du liste.php qu'il faut faire, mais un appel externe, fait par le navigateur, via un html du genre


<img src="liste.php?ID_pick=<?php echo $donnees['ID_pick']; ?>" />
 

ce qui "complexifie" le code, fait faire plus de requêtes vers le serveur, mais à l'avantage que les images peuvent être mises dans le cache du navigateur.

@+

#19 Re : Forum Général PHP » [Formulaire] - Interdire un mot dans mon script php ? » 20-06-2016 14:50:00

Bonjour,

Étape 1 : se forcer à une certaine propreté du code, surtout dans ses identations :


<?php
require('db.php');
if (isset($_POST['username'])){
    $username = $_POST['username'];
    $email = $_POST['email'];
    $password = $_POST['password'];
    $username = stripslashes($username);
    $username = mysql_real_escape_string($username);
    $email = stripslashes($email);
    $email = mysql_real_escape_string($email);
    $password = stripslashes($password);
    $password = mysql_real_escape_string($password);
    $trn_date = date("Y-m-d H:i:s");
       
    if ($username == "word") {
        header("Location: redirection.html");
    } else {
            $query = "INSERT into `users2` (username, password, email, trn_date) VALUES ('$username', '".md5($password)."', '$email', '$trn_date')";
            $result = mysql_query($query);
            if($result){            
                    header("Location: login.php");
            }
    // Je crois que là il manque un } !!
} else {
?>
 

On voit alors qu'il manque des } , je suppose que celle tout en bas c'est normal (il doit y avoir du code encore en dessous), mais celle qui ferme le else du test if sur le username... ça fait deux else qui se suivent, ça ne peut pas fonctionner !

Etape 2 : utilisation d'un array

Il faut avouer que plus les mots à bloquer se multiplie, plus il faut de if, ce n'est pas pratique. On peut donc plutôt utiliser un tableau. On défini donc le tableau des mots à bloquer, exemple :


$motsInterdits = array('word', 'select', 'update');
 

et on utilise la fonction in_array dans le if (cf la documentation smile.

@+

#20 Re : Forum Général PHP » [Résolu] Affichage d'un blob a partir d'une base de donnée » 13-06-2016 15:36:58

Bonjour,

Je pense que la lecture du tutorial http://www.phpdebutant.org/article112.php serait bénéfique.

"Au hasard" je dirai qu'il manque un ; à la fin de la ligne 37 (qui n'est pas la ligne 37 sur l'extrait du code ici, mais la ligne avant celle qui commence par $requete, ce qui me parait bien correspondre).

NB: ce n'est pas une base PHPMyAdmin mais une base MySQL smile

@+

#21 Re : Forum Général PHP » création par un user de son sous domaine sur mon site » 23-01-2014 15:50:10

Bonjour Cedric, Bonjour JC,

L'administrateur système du coin va vous donner une bonne ruse : en fait moins coté Apache, en faire plus coté PHP smile

La solution que je propose, c'est de faire en sorte que tous les sous domaines pointent vers une arborescence unique, et de se débrouiller pour que PHP retrouve son contenu.

C'est donc en deux partie :

- coté Apache, la ruse est dans le serveuralias, exemple :


<VirtualHost *:80>
 ...
 ServerName monsite.com
 ServerAlias *.monsite.com
 ServerAlias www.*.monsite.com
 ...
</VirtualHost>
 

- coté PHP, regarder le contenu de la variable $_SERVER['SERVER_NAME'], qui devrait contenir le sous domaine appelé (enfin elle contiendra par exemple www.tata.monsite.com )

Attention, pour que ca fonctionne, il faut aussi que la directive UseCanonical d'Apache soit sur Off (sinon $_SERVER['SERVER_NAME'] contiendra toujours monsite.com, ce qui ne sera pas pratique).

@+

#22 Re : Défouloir » Bannissement du forum » 17-01-2014 13:24:45

Bonjour Bonjour,

Désolé pour le retard à l'allumage, je suis "un peu" débordé en ce moment (juste 2 trucs en parralèle encore tous l'aprem jusqu'a 18h après avoir enfilé le repas en 15min, plus la todo liste de la semaine qui est encore à 10 taches, plus les debuts de travaux - merci les chats - pour déménager, plus les gamins, plus....), je viens a peine de voir ce post sur la tablette dans un endroit que la politesse m'interdit de préciser plus.

Et je n'ai en effet pas encore expliqué cela.

Tout d'abord une info capitale, afin de refroidir un peu tout le monde : J'ai été banni pour pub aussi ! D'ailleurs MK aussi, mais il n'a pas dut s'en rendre compte. En fait, tout le monde était banni, les utilisateurs enregistrés, les nons enregistrés, en fait plus personne ne pouvait accéder.

J'ai dut intervenir en base de données directement, car je n'avais même plus l'accès à l'admin, c'est pour dire smile

Et c'est bien de la non faute à Maljuna smile Plus précisément, c'est bien lié a son action de bannissement, mais ce n'est pas de sa faute.

Maintenant prenez une aspirine, c'est l'heure de l'explication technique.

Ce forum, comme tous les sites sur nos infrastructures mutualisées, est servi par plusieurs serveurs, "planquées" derrière un répartiteur de charge (redondant, il a son jumeau prêt a prendre le relai si il se casse une jambe, mais ce n'est pas le sujet).

Du coup, par defaut, du point de vue du serveur web, la requete arrive depuis le répartiteur de charge, et non depuis l'ip du visiteur. Ce n'est pas super pratique, donc ça se corrige très bien avec une configuration du répartiteur de charge pour qu'il transmette l'ip du visiteur dans un header http, et coté serveur web un petit module et une configuration pour lui dire "ha ben l'ip, elle est là finalement". Ca fonctionne super bien.

Sauf quand on fait un peu trop de changement. Quelques ip qui changent, du coup, on met à jour une configuration existante sur un cluster un peu ancien. Jusque là, ça va. Puis on propage la configuration sur les autres cluster. Et c'est là que le drame intervient. Le cluster qui est derrière ce forum, entre autre, est plus récent. Et le module qui gère la traduction à légérement changé de nom. Pour ceux qui connaissent la configuration d'Apache, on utilise souvent de IfModule, avec le nom du module. Sauf que quand on met dans la configuration l'ancien nom d'un module, et bien forcément, il ne le trouve pas, et n'active pas la configuration.

Du coup, sur ce forum, tout le monde avait l'ip du répartiteur de charge. Les nouveaux inscrit avaient comme ip d'inscription celle du répartiteur de charge.

Quand Maljuna à posé le bannissement, il a suivi le mode standard, donc blocage de l'utilisateur et de son ip (pour éviter qu'il revienne avec un autre compte trop rapidement). Sauf que du coup, il a banni, sans le savoir, l'ip du répartiteur de charge.

Et paf, tout le monde était à la porte !

Du coup, j'ai changé les ip qui correspondaient au répartiteur de charge dans la base de données, et j'ai corrigé la configuration du module qui posait problème.

Et tout est enfin rentré dans l'ordre !

Donc tu le vois JC, vraiment rien de personnel là dedans, on appelle ça une catastrophe liée à une série de mauvaises manipulations et de quo-incidences.

La bonne nouvelle, c'est qu'on ne travaille pas dans une centrale nucléraire big_smile

En te souhaitant une bonne journée, et par la même occassion une bonne année

@+
ManicoW

#23 Re : Forum Général PHP » calculez tout en gardant les 000 devant » 25-06-2013 16:33:49

Bonjour,

Pour être plus clair, je dirai que 00003 n'est qu'une représentation sous forme de chaine du nombre 3, donc du coup, il faut en effet faire le calcul avec la forme numérique (heureusement php comprend assez bien que 00003 = 3), puis au moment de l'affichage (ou de l'utilisation) refaire la mise en forme.

Les deux techniques ci dessus fonctionnent bien, je proposerai également str_pad http://php.net/manual/en/function.str-pad.php

@+

#24 Re : Forum Général PHP » protection dossier » 10-05-2013 07:34:20

Coucou,

En fait JC l'un des problèmes est qu'un certain nombre d'hébergeurs ne permettent pas de sortir les fichiers de l'arbo web. Dans ce cas un .htaccess c'est mieux que rien (ca fonctionne plutot bien, surtout si il n'y a pas de demande d'authentification mais juste un deny from all smile).

Quant à la sécurisation que cela apporte, on a vu pire déjà.

Le principal avantage, c'est que c'est simple et fiable dans sa façon de fonctionner.

Les principaux défaut, c'est :

- que le mot de passe est transmis en clair (m'enfin c'est le cas aussi dans la plupart des formulaires, peu de gens le crypte avant l'envoi, et si on colle du https par là dessus, c'est plus en clair)

- que c'est pas très souple dans la gestion des utilisateurs

- que ça ne gère aucune notion de droit

Reste qu'a mon sens, c'est plus fiable qu'un bon tas de truc tout fait qui sont finalement des nids a faille de sécurité. Quand je vois le nombre d'appel a des fichiers wp-login.php sur l'infra mutu...

Ce n'est donc pas le plus sécurisé, n’empêche qu'un petit htaccess/htpasswd sur du https en pré-authentification, ça calme déjà plein d'attaques smile

Ensuite le fait de sortir les fichiers de l'arbo web avec un chmod 644, ca ne suffit pas forcément non plus. Il faut encore que php soit limité en accès a l'arbo web (avec un bel include_path bien fait qui permet quand même d'inclure les fichiers include), que l'arbo hors web le soit vraiment (j'ai déjà vu du /var/www/site.tld/includes/ avec le vhost par defaut du serveur sur /var/www/), et que l'user apache (qui en général fait tourner php, ou celui de php le cas échéant) soit différent de celui du ftp, sinon ton 6 du début suffit a le rendre inscriptible par le web. Et vu les problèmes de droits, il n'est pas rare que l'user ftp et php soit le même.

Bref, la sécurité, c'est un truc qui se voit dans un contexte plus global comme tu le dis, et bien se protéger, c'est tout un art, pas forcément facile pour un débutant.

@+

#25 Re : Défouloir » Disponibilité site » 24-04-2013 13:02:16

Re,

Hum, ok JC, je vois le problème, il faut que je vois ensuite comment le contourner. Je pense que cela viens de la régie pub, qui était elle aussi dans les choux (même histoire en fait), et qui du coup a dut entrainer un gros délai d'affichage de page sur le site (car en plus c'est pas une indisponibilité net du service mais un timeout de la connexion faute de réponse, car la réponse qu’émet le serveur n'est jamais reçue, en gros). Du coup il fallait bien une ou deux minutes pour afficher une page du site, pas cool.

Je croyais avoir collé ça en asynchro (genre si la régie pub est cassée ca ne tente de la charger qu'a la fin donc la page se charge), mais visiblement j'ai oublié ce détail là en en gérant d'autres. Je vais revoir ça bientot.

@+

Pied de page des forums

Propulsé par FluxBB