IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Sécurisation de script php faisant appel ou non à un CMS :


Sujet :

Langage PHP

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 30
    Points
    30
    Par défaut Sécurisation de script php faisant appel ou non à un CMS :
    Bonjour
    j'ai un serveur avec des pages html/javascript, le CMS de photos Piwigo sur PHP et Mariadb.

    en javascript un script PHP est appelé par ajax pour récupérer des photos selon leur emprise géographique et la catégorie de photos comme suit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    var catID = 22;
    var SWlat = '43.10'; var NElat = '50.10'; var SWlng = '-2.1'; vat NElng = '4.4';
     
        $.ajax({
            url: 'imagesInCat_ajax.php?catID=' + catID + '&minLat=' + SWlat + '&maxLat=' + NElat + '&minLng=' + SWlng + '&maxLng=' + NElng,
            type: 'post',
            dataType: 'json',
            success: function(response) {
                console.log('call photo ajax : ');
                console.log(response); };  });
    Je voudrais savoir si ce script appelle directement la base de données Mysql/Mariadb, ou si Piwigo est un intermédiaire.

    J'ai utilisé ce script inclus dans PiwigoImagesAndGPX https://github.com/LeOSW42/PiwigoIma...magesInCat.php.

    Je l'ai modifié pour inclure les conditions géographiques de lat/lng, et pour ne plus utiliser "rewquest" mais ajax à la place, car rewquest envoyait trop d'avertissements dans la console.

    Mis à part le fait que je n'arrive pas à sélectionner seulement 30 images car la requête peut en retourner des milliers, on dirait que mon script n'est pas securisé si les requêtes se font directement à Mysql. J'ai appris un mode de préparation de requêtes (prépared statements) qui nécessite la fourniture des informations de connexion à la base de données : je ne vois pas comment faire ici.

    Je vous joins le script modifié Imagesincat_ajax.php que j'utilise :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    <?php // Prepare list of photos
     
    define('PHPWG_ROOT_PATH','./');
    include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
     
    if((isset($_GET['catID'])) && (is_numeric($_GET['catID']))) $catID = $_GET['catID'];
    else $catID = 0;
     
    if((isset($_GET['minLat'])) && (is_numeric($_GET['minLat']))) $minLat = $_GET['minLat'];
    if((isset($_GET['maxLat'])) && (is_numeric($_GET['maxLat']))) $maxLat = $_GET['maxLat'];
    if((isset($_GET['minLng'])) && (is_numeric($_GET['minLng']))) $minLng = $_GET['minLng'];
    if((isset($_GET['maxLng'])) && (is_numeric($_GET['maxLng']))) $maxLng = $_GET['maxLng'];
     
    $forbidden = get_sql_condition_FandF(
    array
    (
        'forbidden_categories' => 'ic.category_id',
        'visible_categories' => 'ic.category_id',
        'visible_images' => 'i.id'
    ),
    "\n AND"
    );
     
        $query="SELECT i.latitude, i.longitude,
        IFNULL(i.name, '') AS `name`,
        IF(i.representative_ext IS NULL,
            CONCAT(SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', 1 ), '-sq.', SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', -1 )),
            TRIM(LEADING '.' FROM
                REPLACE(i.path, TRIM(TRAILING '.' FROM SUBSTRING_INDEX(i.path, '/', -1 )),
                    CONCAT('pwg_representative/',
                        CONCAT(
                            TRIM(TRAILING '.' FROM SUBSTRING_INDEX( SUBSTRING_INDEX(i.path, '/', -1 ) , '.', 1 )),
                            CONCAT('-sq.', i.representative_ext)
                        )
                    )
                )
            )
        ) AS `pathurl`,
        TRIM(TRAILING '/' FROM CONCAT( i.id, '/category/', IFNULL(i.storage_category_id, '') ) ) AS `imgurl`,
        IFNULL(i.comment, '') AS `comment`,
        IFNULL(i.author, '') AS `author`,     IFNULL(i.id, '') AS `category`,
    
        i.width
            FROM ".IMAGES_TABLE." AS i
                INNER JOIN (".IMAGE_CATEGORY_TABLE." AS ic INNER JOIN ".CATEGORIES_TABLE."
                AS c ON ic.category_id = c.id) ON i.id = ic.image_id
                WHERE FIND_IN_SET(".$catID.", c.uppercats) AND i.latitude IS NOT NULL AND i.longitude IS NOT NULL
                AND i.latitude > " .$minLat. " AND i.latitude < " .$maxLat. " 
                AND i.longitude > " .$minLng. " AND i.longitude < " .$maxLng .$forbidden." GROUP BY i.id;";
     
    $php_data = array_from_query($query);
    //print_r($php_data);
    shuffle($php_data);
    array_slice($php_data, 0, 30);   // returns "a", "b", and "c"
    echo json_encode($php_data, JSON_NUMERIC_CHECK);
     
    ?>
    Le résultat d'une requête directe :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    0	
    latitude	48.747502
    longitude	1.926354
    name	"file1"
    pathurl	"/upload/2022/02/01/20220201004515-8232c1a6-sq.jpg"
    imgurl	"471/category"
    comment	"Maison"
    author	""
    category	471
    width	2016
    1	
    latitude	48.800475
    longitude	2.171174
    name	"IMG 0573-1"
    pathurl	"/upload/2022/01/16/20220116033920-98135927-sq.jpg"
    imgurl	"262/category"
    comment	"Parc"
    author	""
    category	262
    width	2016
    Je voudrais donc sécuriser ce code contre les injections SQL et aussi bien obtenir 30 résultats parmi tous les résultats, mélangés (shuffle $phpdata a fonctionné).

    Merci par avance.

    PS : voila ma méthode connue pour les prepared statements (exemple autre application):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
      $sqlX2 = "SELECT gid FROM public.user".$_SESSION['user_id']."_index WHERE name = :current_file";
      $stmt2 = $dbcon->prepare($sqlX2);
      $stmt2->bindValue(':current_file', $ccur);
      $stmt2->execute();
      $data = $stmt2->fetch(PDO::FETCH_ASSOC);
      $tableid = $data['gid'];
    les tables de la base de données mysql pour piwigo (catégorie est inclue dans une table différente de photos/ auteur/etc!)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    +-------------------------------+
    | Tables_in_piwigo              |
    +-------------------------------+
    | piwigo_activity               |
    | piwigo_caddie                 |
    | piwigo_categories             |
    | piwigo_comments               |
    | piwigo_community_pendings     |
    | piwigo_community_permissions  |
    | piwigo_config                 |
    | piwigo_favorites              |
    | piwigo_group_access           |
    | piwigo_groups                 |
    | piwigo_history                |
    | piwigo_history_summary        |
    | piwigo_image_category         |
    | piwigo_image_format           |
    | piwigo_image_tag              |
    | piwigo_images                 |
    | piwigo_languages              |
    | piwigo_lounge                 |
    | piwigo_old_permalinks         |
    | piwigo_osm_places             |
    | piwigo_plugins                |
    | piwigo_rate                   |
    | piwigo_search                 |
    | piwigo_sessions               |
    | piwigo_sites                  |
    | piwigo_tags                   |
    | piwigo_themes                 |
    | piwigo_upgrade                |
    | piwigo_user_access            |
    | piwigo_user_auth_keys         |
    | piwigo_user_cache             |
    | piwigo_user_cache_categories  |
    | piwigo_user_feed              |
    | piwigo_user_group             |
    | piwigo_user_infos             |
    | piwigo_user_mail_notification |
    | piwigo_users                  |
    | piwigo_whois_online           |
    +-------------------------------+
    38 rows in set (0,000 sec)
    un exemple de la table piwigo_images
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    | id | file           | date_available      | date_creation       | name   | comment | author    | hit | filesize | width | height | coi  | representative_ext | date_metadata_update | rating_score | path                                            | storage_category_id | level | md5sum                           | added_by | rotation | latitude  | longitude | lastmodified        |
     
    |  1 | DSCF3509-1.jpg | 2022-01-15 00:42:31 | 2015-07-10 11:20:00 | Neige  | Neige   | monnom    | 590 |     2418 |  2981 |   2236 | NULL | NULL               | 2022-01-14           |         NULL | ./upload/2022/01/15/20420115304231-7e2e6344.jpg |                NULL |     0 | 7e2e63440182f75b0690bfdc56ed8d4b |        1 |        0 | 48.132600 |  1.275430 | 2023-08-02 00:14:53 |

    et 20 lignes de la table piwigo_image_category qui a les informations de toutes les catégories qu'il y a pour une photo (il peut y avoir plusieurs cat. pour 1 photo)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    +----------+-------------+------+
    | image_id | category_id | rank |
    +----------+-------------+------+
    |     4195 |          47 |  367 |
    |     4196 |         108 |  247 |
    |     4197 |          47 |  366 |
    |     1911 |         127 |   13 |
    |        1 |           1 |  149 |
    |        2 |          13 |  272 |
    |        2 |          42 | NULL |
    |        3 |          13 |  271 |
    |        3 |          42 | NULL |
    |        4 |          13 |  270 |
    |        4 |          42 | NULL |
    |        5 |           6 |    1 |
    |        6 |           6 |    2 |
    |        7 |           6 |    3 |
    |        8 |           6 |    4 |
    |        9 |           6 |    5 |
    |       10 |           6 |    6 |
    |       11 |           6 |    7 |
    |       12 |           6 |    8 |
    |       13 |           6 |    9 |
    +----------+-------------+------+

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 30
    Points
    30
    Par défaut
    j'ai obtenu des choses en modifiant le code comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php // Prepare list of photos
     
    define('PHPWG_ROOT_PATH','./');
    include_once( PHPWG_ROOT_PATH.'include/common.inc.php' );
    if(!isset($_SESSION)) {    session_start();  };
    error_reporting(E_ALL);
    ini_set("display_errors", 1);
    header("Access-Control-Allow-Origin: *");
     
    $mysconfig = array (
        "_mysql_db_host_" => "127.0.0.1",
        "_mysql_db_user_" => "root",
        "_mysql_db_pass_" => "passwd",
        "_mysql_db_name_" => "piwigo" );
     
        $myshost = $mysconfig['_mysql_db_host_'];
        $mysuser = $mysconfig['_mysql_db_user_'];
        $myspass = $mysconfig['_mysql_db_pass_'];
        $mysname = $mysconfig['_mysql_db_name_'];
     
        $dbcon7 = new mysqli($myshost, $mysuser, $myspass, 'piwigo');
     
     
    if((isset($_GET['catID'])) && (is_numeric($_GET['catID']))) $catID = $_GET['catID'];
    else $catID = 0;
     
    if((isset($_GET['minLat'])) && (is_numeric($_GET['minLat']))) $minLat = $_GET['minLat'];
    if((isset($_GET['maxLat'])) && (is_numeric($_GET['maxLat']))) $maxLat = $_GET['maxLat'];
    if((isset($_GET['minLng'])) && (is_numeric($_GET['minLng']))) $minLng = $_GET['minLng'];
    if((isset($_GET['maxLng'])) && (is_numeric($_GET['maxLng']))) $maxLng = $_GET['maxLng'];
     
    $forbidden = get_sql_condition_FandF(
    array
    (
        'forbidden_categories' => 'ic.category_id',
        'visible_categories' => 'ic.category_id',
        'visible_images' => 'i.id'
    ),
    "\n AND"
    );
     
    $stmt = $dbcon7 -> prepare("SELECT i.latitude, i.longitude,
        IFNULL(i.name, '') AS `name`,
        IF(i.representative_ext IS NULL,
            CONCAT(SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', 1 ), '-sq.', SUBSTRING_INDEX(TRIM(LEADING '.' FROM i.path), '.', -1 )),
            TRIM(LEADING '.' FROM
                REPLACE(i.path, TRIM(TRAILING '.' FROM SUBSTRING_INDEX(i.path, '/', -1 )),
                    CONCAT('pwg_representative/',
                        CONCAT(
                            TRIM(TRAILING '.' FROM SUBSTRING_INDEX( SUBSTRING_INDEX(i.path, '/', -1 ) , '.', 1 )),
                            CONCAT('-sq.', i.representative_ext)
                        )
                    )
                )
            )
        ) AS `pathurl`,
        TRIM(TRAILING '/' FROM CONCAT( i.id, '/category/', IFNULL(i.storage_category_id, '') ) ) AS `imgurl`,
        IFNULL(i.comment, '') AS `comment`,
        IFNULL(i.author, '') AS `author`,     IFNULL(i.id, '') AS `category`,
    
        i.width
            FROM piwigo_images AS i
                INNER JOIN (piwigo_image_category AS ic INNER JOIN piwigo_categories
                AS c ON ic.category_id = c.id) ON i.id = ic.image_id
                WHERE FIND_IN_SET(?, c.uppercats) AND i.latitude IS NOT NULL AND i.longitude IS NOT NULL
                AND i.latitude > ? AND i.latitude < ? 
                AND i.longitude > ? AND i.longitude < ? ".$forbidden." GROUP BY i.id;");
     
    $stmt -> bind_param("sssss", $catID, $minLat, $maxLat, $minLng, $maxLng);          
     
    $stmt->execute();
     
    $result = $stmt->get_result();
     
    $assoc = $result->fetch_assoc();
     
    //shuffle($assoc);
    //array_slice($assoc, 0, 30);   // returns "a", "b", and "c"
     
    foreach ($assoc as $result) {
        echo $result;
        echo "<br>";
    }
    mais ce resultat n'inclut que la premiere ligne (row)

    48.1326
    1.27543
    fleuve
    /upload/2022/01/15/20220113004231-7e2e6344-sq.jpg
    1/category
    fleuve
    maxime
    1
    2981
    comment recuperer toutes les lignes ?

    apres, je les melangerai, selectionnerai uniquement les 30 premieres et les encoderai en json...

  3. #3
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    mysqli_result::fetch_assoc n'est censé renvoyer qu'un enregistrement à la fois, il suffit de boucler comme c'est décrit dans la page pour avoir tous les résultats.

  4. #4
    Nouveau membre du Club
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 30
    Points
    30
    Par défaut
    Merci.

    j'ai crée un array en début de code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        $fjson = array(
            'type' => 'FeatureCollection',
            'features' => array()
          );
    et j'ai donc fait un "loop" comme conseillé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    while ($row = $result->fetch_assoc()) {
        $feature = array(
            'latitude' => $row['latitude'],
            'longitude' => $row['longitude'],
            'name' => $row['name'],
            'author' => $row['author'],
            'id' => $row['category'],
            'width' => $row['width'],
            'thumburl' => get_absolute_root_url() ."i.php?".str_replace('sq','2s',$row['pathurl']),
            'linkurl' => get_absolute_root_url() ."picture.php?/".$row['imgurl'],
            'imgurl' => get_absolute_root_url() ."i.php?".str_replace('sq','xs',$row['pathurl']),
          );
        array_push($fjson['features'], $feature);
    }
     
    $sjson = shuffle($fjson);
    //$cjson = array_slice($sjson, 0, 30); 
    header('Content-Type: application/json/
    echo json_encode($fjson, JSON_NUMERIC_CHECK);
    mais il y a je pense des problemes avec les accents.
    si je désactive avec des barres // author et name, j'ai bien un json en sortie.
    mais si je les active, tres souvent je n'ai aucun résultat : page blanche.

    je recupere le set d'une autre zone, et name et author ne fonctionnent qu'en l'absence d'accents (exemple : Segré, Sélestat)

    en attendant j'ai supprimé les accents pour avancer, mais Château de Bouesse devient ChteaudeBouesse

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
       $a =  preg_replace("/[^A-Za-z0-9\-\']/", '', $row['author']);
    par ailleurs shuffle fonctionne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sjson = shuffle($fjson);
    mais pas array_slice

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $cjson = array_slice($sjson, 0, 30);

    qui donne


    Fatal error: Uncaught TypeError: array_slice(): Argument #1 ($array) must be of type array, bool given in /usr/share/nginx/html/piwigo/imagesInCat_ajax.php:103 Stack trace: #0 /usr/share/nginx/html/piwigo/imagesInCat_ajax.php(103): array_slice() #1 {main} thrown in /usr/share/nginx/html/piwigo/imagesInCat_ajax.php on line 103

  5. #5
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Ça c'est parce que tu récupères des chaînes encodées en ISO8859-1 (ou équivalent) et pas en UTF-8, ce qui fait que json_encode renvoie false. Donc à toi de trouver pourquoi ces chaînes t'arrivent avec le mauvais encodage.

    Déjà dans ton code précédent je ne vois nulle part l'encodage de ta connexion à MySQL:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $dbcon7->set_charset("utf8");

    shuffle n'est pas une fonction mais une procédure (i.e. il ne renvoie rien, enfin si, il renvoie toujours true, mais il change le tableau passé en argument "in-place").

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 30
    Points
    30
    Par défaut
    Merci CosmoKnacki :
    cette ligne que tu me conseille, a résolu le souci des accents :

    exemple copié de mon json en résultat : "Pâté aux pommes de terre"

    résolu de ce coté là

    par ailleurs, le souci de array_slice a été résolu par

    au lieu de ce que j'avais mis, et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
        array_push($fjson, $feature);
    à la fin, et pas un sous-array.

    Tout est parfait

  7. #7
    Expert éminent Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 912
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 912
    Points : 6 705
    Points
    6 705
    Par défaut
    Je t'invite à une réflexion à propos de ton code:
    Je note qu'avec ton approche (demander tous les enregistrements correspondant à tes critères à la base de données pour, coté php, les mélanger et n'en garder que 30) tu risques une consommation inutile de la mémoire (ce qui peut être un problème si la base de données te renvoie beaucoup d'enregistrements).
    Suivant le nombre d'enregistrements que contient ta base, il existe des possibilités pour faire ce travail (la randomisation et la limitation) coté SQL. Le plus direct serait d'ajouter ORDER BY rand() LIMIT 30 à ta requête, mais cette méthode souffre d'un sérieux manque d'efficacité dés lors que le nombre d'enregistrements est important.
    Il existe des blogs qui traitent de ce sujet:
    Mais ce serait une bonne idée de soumettre la question au forum MySQL.

  8. #8
    Nouveau membre du Club
    Homme Profil pro
    Architecte sys d'info géographique
    Inscrit en
    Juin 2011
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Architecte sys d'info géographique
    Secteur : Transports

    Informations forums :
    Inscription : Juin 2011
    Messages : 64
    Points : 30
    Points
    30
    Par défaut
    Merci, je cherchais en effet une solution à ce problème !

    Jusque récemment, je ne bloquais d'ailleurs pas la requête dans le php :

    le javascript client recevait un array de centaines, voire milliers de lignes, c'était dans le navigateur que cet array était mélangé et qu'une boucle javascript n'en conservait que 30 qui étaient alors affichées.

    j'ai pensé que c'était lent pour l'ordinateur client, et j'ai donc réussi cette fonction dans le php, mais il me semblait effectivement que ça pouvait rester long aussi pour le serveur.

    ma réflexion était donc, sans avoir été plus loin :
    - de récuperer uniquement une colonne, l'identifiant "select id from.." de toutes les lignes,
    - de les melanger, et retenir que les 30 premiers,
    - d'effectuer une jointure avec les colonnes restantes, pour les 30 identifiant retenus

    mais je n'avais pas les compétences pour ça.

    je viens donc de faire ce que tu me conseille à l'instant, et ça me satisfait pour le moment

    j'étudierai bien tes liens.

    merci encore et bonne soirée !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Sécuriser ses scripts PHP
    Par Eylun dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 5
    Dernier message: 21/11/2017, 00h03
  2. Réponses: 10
    Dernier message: 06/01/2016, 01h39
  3. [PHP 5.4] Comment sécuriser appel d'un script PHP
    Par vince29 dans le forum Langage
    Réponses: 0
    Dernier message: 20/05/2014, 16h05
  4. [MySQL] Sécuriser ce script php
    Par niouws dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 24/07/2012, 12h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo