Partage
  • Partager sur Facebook
  • Partager sur Twitter

FAQ du forum PHP

A CONSULTER AVANT DE POSTER

2 avril 2008 à 0:14:58

Auteur: strucky

Comment récupérer la ligne d'une table dont une colonne possède la plus grande valeur ?


2 méthodes :

Avec un LIMIT

  1. SELECT les_colonnes FROM la_table ORDER BY colonneX DESC LIMIT 1;


Avec une sous-requête et un MAX(), méthode sans doute plus légère sur des tables conséquentes.

  1. SELECT les_colonnes FROM la_table WHERE colonneX = (SELECT MAX(colonneX) FROM la_table);
  • Partager sur Facebook
  • Partager sur Twitter
2 avril 2008 à 0:17:29

Auteur: strucky

Comment récupérer la plus grande valeur de chaque groupes dans une table ?


Réponse:

Avec une sous-requête :

  1. SELECT colA, colZ FROM la_table T1
  2. WHERE colZ = (
  3.    SELECT MAX(colZ) FROM la_table T2 WHERE T1.colA = T2.colA
  4. );


On récupérera donc toutes les entrées de la table par groupe sur colA avec la valeur la plus grande de colZ.

Autre méthode donnant le même résultat avec une auto-jointure :

  1. SELECT T1.colA, T1.colZ FROM la_table T1
  2. INNER JOIN la_table T2
  3.   ON T1.colA = T2.colA
  4.   AND T1.colZ <= T2.colZ
  5. GROUP BY T1.colZ HAVING COUNT(*) = 1;
  • Partager sur Facebook
  • Partager sur Twitter
2 avril 2008 à 0:21:24

Auteur: strucky

Comment sélectionner les lignes d'une table dont le 1er caractère d'une colonne doit-être une lettre ou un chiffre ?


En se servant de la fonction LEFT() et de l'expression BETWEEN de MySQL.

  1. SELECT les_colonnes FROM la_table WHERE LEFT(colX, 1) BETWEEN 'a' AND 'z';


Cette requête ne fera pas de différences entre minuscules et majucules pour colX si vous avez une collation insensible à la casse.

Récupérer seulement les lignes ou le 1er caractère de colX est une lettre en minuscule ?

En se servant de l'expression BINARY

  1. SELECT les_colonnes FROM la_table WHERE LEFT(BINARY colX, 1) BETWEEN 'a' AND 'z';


Une lettre en majuscule uniquement :

  1. SELECT les_colonnes FROM la_table WHERE LEFT(BINARY colX, 1) BETWEEN 'A' AND 'Z';


Récupérer les lignes dont le 1er caractère de colX est un chiffre de 1 à 9

  1. SELECT les_colonnes FROM la_table WHERE LEFT(colX, 1) BETWEEN 1 AND 9;


Si vous désirez obtenir celles ou le 1er caractère vaut également 0, il faudra quoter les chiffres dans le BETWEEN


  1. SELECT les_colonnes FROM la_table WHERE LEFT(colX, 1) BETWEEN '0' AND '9';


Les lignes où le 1er caractère de colX est une lettre ou chiffre ?

  1. SELECT les_colonnes FROM la_table WHERE colX REGEXP '^[[:alnum:]]';
  • Partager sur Facebook
  • Partager sur Twitter
12 avril 2008 à 15:20:12

Auteur: strucky

Comment récupérer l'url de ma page en cours ?


Réponse:

Pour récupérer toute l'url, c'est à dire avec les paramètres GET, il faut se servir de :

  1. <?php $_SERVER['REQUEST_URI']


Si l'on désire récupérer uniquement l'url sans les arguments GET :

  1. <?php $_SERVER['PHP_SELF']
  • Partager sur Facebook
  • Partager sur Twitter
12 avril 2008 à 15:23:54

Auteur: strucky

Fatal error: Cannot redeclare ma_fonction() (previously declared in /var/www/monfichier.php:8) in /var/www/monfichier.php on line 11


Si vous avez ce genre d'erreur, c'est que vous tentez de redéclarer une fonction de votre script qui l'a déjà été.

- Vérifiez donc que dans le script de votre page, vous ne l'avez pas déclarée explicitement plus d'une fois.
- Vérifiez que la déclaration de votre fonction ne se situe pas dans une boucle, si c'est le cas, sortez-là de cette boucle.
- Vérifiez que vous ne faîtes pas plusieurs includes de votre fichier contenant cette fonction.
Si vous ne savez pas comment faire pour savoir si votre fichier contenant cette fonction a déjà appelé quelque part dans votre application, include_once et require_once sont vos alliés.
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2008 à 12:50:51

Auteur: strucky

Mes cookies ne fonctionnent pas, quelles peuvent-en être les raisons ?


Réponse:

A savoir, un cookie n'est disponible (après l'avoir créé bien entendu) seulement qu'après rechargement de la page en cours, ou chargement d'une autre page.


Par étape :

- Vérifiez les options de votre navigateur, est-il configuré de façon à accepter les cookies ?
- Toujours sur votre navigateur, vérifiez si oui ou non vos cookies y sont présents (voir options de celui-ci).
- Vérifiez que vous avez bien spécifié une durée de vie du cookie correcte (supérieure au timestamp actuel).
- Si vous créez vos cookies dans une page étant dans un sous-répertoire de votre site, et que vous en avez besoin dans une page située à sa racine, vous devez renseigner le 4ème argument de la fonction, dans le cas exposé, un / donc (racine du site).

Comme toujours la documentation est votre meilleure alliée.
  • Partager sur Facebook
  • Partager sur Twitter
26 avril 2008 à 12:53:22

Auteur: strucky

Comment faire des actions différentes sur mon formulaire en fonction du bouton submit utilisé ?


Réponse:

La solution est simple, il suffit de donner des name à chaque input submit de votre form, et de tester dans votre script lequel a été utilisé.

<form action="" method="post">
<!--
Champs de mon formulaire
-->
<p>
   <input type="submit" name="envoi" value="Envoyer" />
   <input type="submit" name="prevu" value="Visualiser" />
</p>
</form>


<?php
if( !empty($_POST) )
{
   if( isset($_POST['prevu']) )
   {
      // Code faisant la prévisualisation
   }
   else
   {
      // Code de l'enregistrement
   }
}
  • Partager sur Facebook
  • Partager sur Twitter
4 novembre 2008 à 11:39:45

Auteur : strucky

Comment transférer des données d'une table à une autre simplement ?


Réponse:

Il suffit simplement d'utiliser la syntaxe INSERT ... SELECT

Exemple :

INSERT INTO laTableDeDestination(colonneX, colonneY)
SELECT colonneX, colonneY FROM laTableSource;


Comme toujours, consultez la doc pour de plus amples informations.
  • Partager sur Facebook
  • Partager sur Twitter
13 novembre 2008 à 11:02:42

Auteur: Makkhdyn

Comment afficher le code source d'une page php ?


Vous pouvez le faire directement en spécifiant une extension .phps à votre fichier dans l'url si votre hébergeur l'autorise.

Sinon tenter d'ajouter
AddType application/x-httpd-php-source .phps


Dans un .htaccess, ou mieux éditez votre httpd.conf si vous êtes maitre du serveur.

Autre solution pour le faire avec un petit bout de code php.

<?php
if(isset($_GET['source']))
{
    exit(show_source(__FILE__));
}
?>


Explication : Il suffit d'ajouter ?source à l'url qui mène à cette page pour pouvoir voir la source.
  • Partager sur Facebook
  • Partager sur Twitter
18 novembre 2008 à 20:34:04

Auteur: thelittlegui

Comment inverser les effets du nl2br ?


Réponse :

Avec une petite fonction se servant d'un str_replace().

<?php
function br2nl($string)
{
    return str_replace(nl2br("\n"), "\n", $string); // Vous pouvez remplacer directement nl2br("\n") par <br> ou <br /> selon votre version de php
}
?>


Exemple:
<?php
$chaine = "test<br />\ntest"; //Sous PHP >= 4.0.5
$chaine = "test<br>\ntest"; //Sous PHP < 4.0.5
echo br2nl($chaine);
?>


Citation : Rendu

test
test

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2008 à 20:47:46

Auteur : Bison

Comment savoir si une année est bissextile ?


Réponse :

Citation : Wikipedia

Depuis l'instauration du calendrier grégorien, sont bissextiles les années :
divisibles par 4 mais non divisibles par 100 ou divisibles par 400.



<?php
function bissextile($annee)
{
    return checkdate(2,29,$annee);
}
?>

checkdate() retournera donc false pour les années ne comportant pas de 29 février.

Exemple:

<?php
$i = 1999;
while(++$i < 2006)
{
    echo $i.' : ';
    var_dump(bissextile($i));
}
?>


Citation : Résultat

2000 : bool(true)
2001 : bool(false)
2002 : bool(false)
2003 : bool(false)
2004 : bool(true)
2005 : bool(false)

  • Partager sur Facebook
  • Partager sur Twitter
23 novembre 2008 à 20:56:22

Auteur: Flolfou

Comment vérifier la validité du domaine d'une adresse email ?


Réponse :

<?php
function verif_email($email)
{
    list($user, $domaine) = split("@", $email,2);
    return(checkdnsrr($domaine, "MX"));
}?>


Exemple:
<?php
if(verif_email('siteduzero@hotmail.com'))
    echo 'hotmail.com existe bien';
else
    echo 'hotmail.com n\'existe pas';
?>


Citation : résultat

hotmail.com existe bien



La fonction checkdnsrr() n'est pas disponible sur système windows.

Dans le cas où vous développeriez sur système windows et que votre site serait en production sur système linux, vous pouvez créer cette fonction en ne retournant qu'un simple booléen dans le but d'éviter la génération d'une erreur fatale.

<?php
if( !function_exists('checkdnsrr') )
{
    function checkdnsrr()
    {
        return true;
    }
}
  • Partager sur Facebook
  • Partager sur Twitter
25 novembre 2008 à 15:52:23

Auteur : strucky

Comment passer plusieurs informations dans des champs de formulaire portant le même name lors d'une soumission ?


Simplement en indiquant que l'on passe un array, les champs de formulaires les gérant nativement.
On indique que des champs de formulaires font partie d'un tableau en ajoutant une paire de crochets dans l'attribut name.

Seuls les éléments cochés seront transmis par le formulaire.


<form action="" method="post">
  <p>
    <input type="text" name="plop[]" value="10" />
    <input type="text" name="plop[]" value="20" />
  </p>
  <p>
    <input type="submit" value="Test" />
  </p>
</form>


Le résultat de $_POST['plop'] sera donc un tableau et vaudra :

<?php

print_r($_POST['plop'];

/*
Array
(
    [0] => 10
    [1] => 20
)
*/


Il est évidemment possible de le faire avec des champs de type autres que text.

Exemple avec des ids d'une table passées dans des cases à cocher, pour modification de l'état d'une colonne des lignes de la table :

<?php
$sql = 'SELECT id, etat FROM uneTable ORDER BY id DESC';
$result = mysql_query($sql) or exit(mysql_error());

 echo '
<form action="" method="post">
  <p>
';

while( $l = mysql_fetch_assoc($result) )
{
    echo '<label for="' . $l['id'] . '">' . $l['id'] . '</label>';
    $checked = $l['etat'] == 1 ? ' checked="checked"' : '';
    echo '<input id="' . $l['id'] . '" type="checkbox" name="listeId[]"' . $checked . ' />';
}

echo '</p>
  <p>
   <input type="submit" value="Modifier les états" />
  </p>
</form>';


Que l'on pourrait traiter simplement par :

<?php
if( !empty($_POST['listeId']) && is_array($_POST['listeId']) )
{
    $_POST['listeId'] = array_unique(array_map('intval', $_POST['listeId']));
    // Mise à l'état actif des ids reçus
    $sql = 'UPDATE uneTable SET etat=1 WHERE id IN(' . implode(',', $_POST['listeId']) . ')';
    $result = mysql_query($sql) or exit(mysql_error());
    // Mise à l'état inactif des ids non reçus
    $sql = 'UPDATE uneTable SET etat=0 WHERE id NOT IN(' . implode(',', $_POST['listeId']) . ')';
    $result = mysql_query($sql) or exit(mysql_error());
}


Autre exemple avec un upload multiple :

<?php
$nbChamp = 5;
echo '<form action="" method="post" enctype="multipart/form-data">'; // Ne pas omettre l'attribut enctype
for( $i=0; $i<$nbChamp; $i++ )
{
    echo '<p><input type="file" name="image[]" /></p>';
}
echo '<p>
   <input type="submit" value="Téléverser les images" />
  </p>
</form>';


Que l'on pourrait vérifier avec :

<?php
if( !empty($_FILES['image']) && array_filter($_FILES['image']['tmp_name']) )
{
    for( $nbImg=count($_FILES['image']['tmp_name']), $i=0; $i<$nbImg; $i++ )
    {
        // On fait nos vérifications et actions pour chaque images
        // Soit : 
	// $_FILES['image']['name'][$i]
        // $_FILES['image']['tmp_name'][$i]
        // etc...
        // Faites un print_r($_FILES) pour visualiser comment se présente le tableau 
    }
}


Il est possible de spécifier des index directement dans les champs du formulaire, en les mettant entre les crochets bien entendu.
  • Partager sur Facebook
  • Partager sur Twitter
30 novembre 2008 à 22:34:06

Auteur : strucky

Pourquoi lorsque j'enregistre un nombre dans ma table, MySQL me met à chaque fois 127 ou un autre nombre inférieur à ma valeur ?


Réponse :

Tout simplement parce que vous avez spécifié lors de la création de votre table un TINYINT ou autre type entier trop petit vis à vis des valeurs que vous voulez y enregistrer.

Un type TINYINT non signés ne peut contenir que des valeurs situées entre -128 et 127, d'où le 127 qui est le maximum.

Consultez la doc MySQL pour choisir le type adéquat aux nombres à enregistrer.

Si votre colonne ne doit contenir que des nombres entiers positifs, spécifiez le UNSIGNED.
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2008 à 15:58:59

Pourquoi lorsque je spécifie un ORDER BY sur une colonne contenant des nombres, MySQL ne me les affiche pas dans le bon ordre ?


Tout simplement parce que vous n'avez pas spécifiez une colonne de type entier pour stocker vos numériques.

Exemple basique d'une table dont la colonne a été établie en VARCHAR.

CREATE TABLE nombres(valeur VARCHAR(5));
INSERT INTO nombres(valeur) VALUES(1), (2), (3), (4), (15), (26), (38), (62), (79);


Si l'on désire les trier en ordre croissant, MySQL va trier la colonne comme des string, et non comme des integer, d'où le résultat "chaotique" :

SELECT valeur FROM nombres ORDER BY valeur;

+--------+
| valeur |
+--------+
| 1      | 
| 15     | 
| 2      | 
| 26     | 
| 3      | 
| 38     | 
| 4      | 
| 62     | 
| 79     | 
+--------+


En transtypant la colonne en type entier, on obtient le résultat attendu.

SELECT valeur FROM nombres ORDER BY CAST(valeur AS UNSIGNED);

+--------+
| valeur |
+--------+
| 1      | 
| 2      | 
| 3      | 
| 4      | 
| 15     | 
| 26     | 
| 38     | 
| 62     | 
| 79     | 
+--------+


Mais il est sans aucun doute préférable de modifier le type de la colonne.

ALTER TABLE nombres MODIFY valeur INT UNSIGNED;
  • Partager sur Facebook
  • Partager sur Twitter
13 décembre 2008 à 16:38:55

Auteur: winzou

La doc à portée de la main avec Firefox


Explication:

Mettez php.net dans les marques pages, avec comme mot clé "php" et comme adresse http://php.net/%s

Comme ça, lorsque vous tapez "php plop" dans la barre d'url, ca va directement sur http://php.net/plop
  • Partager sur Facebook
  • Partager sur Twitter
30 janvier 2009 à 16:03:40

Auteur: Talus

Comment afficher la date au format français ?


En se servant de la fonction setlocale()

setlocale(LC_ALL, 'fr_FR.ISO_8859-1', 'fr_FR','fr','fr','fra','fr_FR@euro');
echo strftime("%A %d %B %Y");


Donnera donc « vendredi 30 janvier 2009 »

  • Partager sur Facebook
  • Partager sur Twitter
24 septembre 2011 à 1:54:13

Auteur: 999888

Apache a rencontré un problème...


Veuillez lire ce topic afin de régler le problème.
  • Partager sur Facebook
  • Partager sur Twitter