Discussion: php et readonly

  1. #1
    Membre régulier
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    décembre 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : décembre 2008
    Messages : 185
    Points : 113
    Points
    113

    Par défaut php et readonly

    Bonjour,
    J'ai un champ input de type text avec une propriété readonly="readonly". Ce champ contient une valeur 0.
    Lorsque je place le curseur avant le 0 et que je clique sur la touche 'suppr', tout est normal, rien ne se passe.
    Lorsque je place le curseur après le 0 et que je clique sur la touche d'effacement arrière, le navigateur m'affiche la page précédente.

    Je n'arrive pas à comprendre si cela vient du html ou est du au code php.
    J'hésite à vous mettre mon code entier car il dépasse les 350 lignes.

  2. #2
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    9 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 9 812
    Points : 19 735
    Points
    19 735

    Par défaut

    Bonjour,

    Le code nécessaire et suffisant... suffira.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  3. #3
    Membre régulier
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    décembre 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : décembre 2008
    Messages : 185
    Points : 113
    Points
    113

    Par défaut

    Faute de voir ce qui est nécessaire et suffisant, je mets tout.
    Code php : 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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    272
    273
    274
    275
    276
    277
    278
    279
    280
    281
    282
    283
    284
    285
    286
    287
    288
    289
    290
    291
    292
    293
    294
    295
    296
    297
    298
    299
    300
    301
    302
    303
    304
    305
    306
    307
    308
    309
    310
    311
    312
    313
    314
    315
    316
    317
    318
    319
    320
    321
    322
    323
    324
    325
    326
    327
    328
    329
    330
    331
    332
    333
    334
    335
    336
    337
    338
    339
    340
    341
    342
    343
    344
    345
    346
    347
    348
    349
    350
    351
    352
    353
    354
    355
    356
    357
    358
    359
    360
    361
    362
    363
    <?php
     
    // Gamme Proginet
    // Application sirap
    // Formulaire administrateur - édition abonné
    // Version 2.0
    // Auteur Marc Paris
     
    ##################################################################### SECTION TETE : PARAMETRAGE AUTORISATION ##########################################################
     
    session_start();
    include('../_libraries/_defines.php');
    include('../_libraries/_routines.php');
    include('../_languages/fr.php'); // pour le script js
    // Recherche automatique des classes
    spl_autoload_register(function($class) {require "../_classes/" . "$class.class.php";});
     
    ##################################################################### Fin SECTION TETE : PARAMETRAGE AUTORISATION ######################################################
     
    ##################################################################### SECTION MODELE ###################################################################################
     
    connect();
     
    function getCurrentAbo($id_abo) {
    	global $db;
     
    	$query = "
    		SELECT *
    		FROM dat_abonnes
    		WHERE id=:id
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id', $id_abo);
    	$result->execute();
    	return $result->fetch();
    }
     
    function getUsers($id_abo) {
    	global $db;
     
    	$query = "
    		SELECT id, code, mdp
    		FROM dat_users
    		WHERE id_abo=:id_abo
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id_abo', $id_abo);
    	$result->execute();
    	return $result->fetchAll();
    }
     
    function createAbo($toSave) {
    	global $db;
     
    	$query = "
    		INSERT IGNORE INTO
    			dat_abonnes(pseudo, client_nom, courriel, contact_nom, contact_prenom, adresse1, adresse2, cp, ville, pays, banni, init_abo, date_creation)
    		VALUES(:pseudo, :client_nom, :courriel, :contact_nom, :contact_prenom, :adresse1, :adresse2, :cp, :ville, :pays, :banni, :init_abo, :date_creation)
    	;";
    	$result = $db->prepare($query);
    	$result->execute($toSave);
    	if ($result->rowCount()) $_SESSION['admin']['id_abo'] = $db->lastInsertId();
    	return $result->rowCount();
    }
     
    function updateAbo($toSave) {
    	global $db;
    	var_dump($toSave);
     
    	$query = "
    		UPDATE dat_abonnes
     		SET pseudo=:pseudo, client_nom=:client_nom, courriel=:courriel, contact_nom=:contact_nom, contact_prenom=:contact_prenom,
    			adresse1=:adresse1, adresse2=:adresse2, cp=:cp, ville=:ville, pays=:pays, banni=:banni, init_abo=:init_abo
    		WHERE id=:id
    	;";
    	$result = $db->prepare($query);
    	$result->execute($toSave);
    	return $result->rowCount();
    }
     
    function ctlDuplicates($post) {
    	global $db;
     
    	$query = "
    		SELECT pseudo, client_nom, contact_nom, contact_prenom, courriel
    		FROM dat_abonnes
    	;";
    	$result = $db->query($query);
    	$data = $result->fetchAll();
     
    	$msg = [];
    	foreach ($data as $objRecord) {
    		$tmp = new ArrayObject($objRecord);
    		$record = $tmp->getArrayCopy();
    		if (in_array($post['pseudo'], $record)) $msg[] = "Ce pseudo existe déjà.";
    		if (in_array($post['client_nom'], $record) and in_array($post['contact_nom'], $record) and in_array($post['contact_prenom'], $record))
    			$msg[] = "L'ensemble (nom abonné) + (nom + prénom) existe déjà.";
    		if (in_array($post['courriel'], $record)) $msg[] = "L'adresse courriel existe déjà.";
    	}
    	return $msg;
    }
     
    // A TESTER APRES REALISATION DE editUset.php
    // Suppression d'un utilisateur
    function delUser($id) {
    	global $db;
     
    	$query = "
    		DELETE FROM dat_users
    		WHERE id=:id;
    	;";
    	$result = $db->prepare($query);
    	$result->bindParam('id', $id);
    	$result->execute();
    }
     
    ##################################################################### FIN section MODELE ###############################################################################
     
    ##################################################################### SECTION CONTROLE #################################################################################
     
    define('TODAY_SQL', date('Y-m-d'));
     
    // Sélection du client à traiter
    $id_abo = 0;
    if (isset($_POST['id_abo'])) { // $_POST du formulaire précédent (selectAbo.php)
    	$id_abo = (int) $_POST['id_abo'];
    	$_SESSION['admin']['id_abo'] = $id_abo;
    }
    elseif (!empty($_SESSION['admin']['id_abo'])) {
    	$id_abo = $_SESSION['admin']['id_abo'];
    }
    // remettre ici le else qui renvoie à la page précédente
     
    $errors[0] = '';
     
    ####### Suppression d'un utilisateur de l'abonné #######
    if (isset($_GET['wxc']) and isAllowed(3)) {
    	delUser($_GET['wxc']);
    }
     
     
    ############### Action du bouton 'reset' ###############
    if (isset($_POST['reset'])) {
    	unset($_POST);
    }
     
    ############### Action du bouton 'new' #################
    if (isset($_POST['newUser'])) {
    	header('location: editUser.php');
     
    	unset($_POST['new']);
    }
     
    ############### Action du bouton 'save' ################
    if (isset($_POST['save'])) {
    	unset($_POST['save']);
     
    	// Contrôles de saisie
    	if (! preg_match("#^[a-zA-Z]\w{3,11}$#", $_POST['pseudo']))
    		$errors[] = " Le pseudo doit commencer par une lettre et comporter entre 4 et 12 caractères (lettres, chiffres ou le signe _ ).";
    	if (! preg_match("#^[a-zA-Z][\wéèêëçàùäïîöôüñ \(\)\._-]{1,39}$#", $_POST['client_nom']))
    		$errors[] =" Le nom de l'abonné doit commencer par une lettre non accentuée et comporter entre 2 et 40 caractères (lettres, chiffres, espaces, parenthèses ou les signes '_' et '-'.";
    	if (! ctl_email($_POST['courriel']))
    		$errors[] = "L'adresse courriel n'est pas une adresse valide.";
    	if (! ctl_lastname($_POST['contact_nom']))
    		$errors[] = "Le nom doit commencer par une particule ou une majuscule et comporter entre 2 et 40 caractères, ne comporter que des lettres, des espaces ou les caractères - et '.";
    	if (strlen($_POST['contact_nom']) >40)
    		$errors[] = "Le nom doit commencer par une particule ou une majuscule et comporter entre 2 et 40 caractères, ne comporter que des lettres, des espaces ou les caractères - et '.";
    	$_POST['contact_prenom'] = mb_convert_case($_POST['contact_prenom'], MB_CASE_TITLE);
    	if (! ctl_firstname($_POST['contact_prenom']))
    		$errors[] = "Le prénom doit comporter entre 2 et 40 caractères, commencer par une majuscule et ne comporter que des lettres, des espaces ou les caractères - et \'.'";
     
    	// Assemblage des données du formulaire dans un tableau avant enregistrement dans la base de données
    	if (count($errors) <= 1) {
    		$toSave = $_POST;
    		unset($toSave['save']);
    		$toSave['banni'] = isset($_POST['banni']) ? 1: 0;
     
    		// Cas d'un ## NOUVEAU CLIENT ##
    		if ($id_abo == 0) {
    			// Enregistrement des données
    			unset($toSave['id']);
    			$toSave['date_creation'] = date('Y-m-d');
    			$ctl = createAbo($toSave);
    			if ($ctl) {
    				$id_abo = $_SESSION['admin']['id_abo'];
    				$errors[0] = "Votre enregistrement a bien été effectué.";
    			}
    			else {
    				$errors[] = "Votre enregistrement n'a pas pu être effectué.";
    				$ctl2 = ctlDuplicates($_POST);
    				if (is_array($ctl2)) $errors = array_merge($errors, $ctl2);
    			}
    		}
     
    		// Cas de la ## MODIFICATION ## d'un client
    		if ($id_abo != 0) {
    			$ctl = updateAbo($toSave);
    			if ($ctl) $errors[0] = "Vos modifications ont bien été enregistrées.";
    			else $errors[] = "Vos données n'ont pas été modifiées.";
    		}
    	}
    }
     
    if (! empty($id_abo)) { // Cas de la modification d'un client existant
     
    	// La ligne suivante est située après l'enregistrement pour prendre en compte les données modifiées dans le formulaire
    	$tmp = new ArrayObject(getCurrentAbo($id_abo));
    	$_POST = $tmp->getArrayCopy();
     
    	// Création des lignes du tableau des utilisateurs de l'abonné
    	$users = getUsers($id_abo);
    	$lines = '';
    	foreach ($users as $user) {
    		$line = new tabLine();
    		$line->addCell(new tabCell($user->code));
    		$line->addCell(new tabCell("<a href='editUser.php?user=$user->id'><img src='../".DIR_IMAGES."edit.png' /></a>"));
    		$line->addCell(new tabCell("<a href='?wxc=$user->id'><img src='../".DIR_IMAGES."del.png' /></a>"));
    		$lines .= $line;
    	}
    }
     
    // Récupération de la liste des pays en base de données
    $colName = "fr_name";
    $objCountries = new readTable($db, 'lst_countries', ['id', $colName], 1);
    $objCountries->set_filter('filter', 1);
    $countries = $objCountries->get_data();
    //array_unshift($countries, ['id'=>'', 'fr_name'=>'-----']); // Option vierge
     
    // Création de la liste de choix des pays
    $lstCountries = new optListSelect("pays");
    foreach ($countries as $key=>$country) {
    	$selected = '';
    	if (!empty($_POST['pays'])) $_POST['pays'] = strtoupper($_POST['pays']);
    	$country['id'] = strtoupper($country['id']);
    	if (empty($_POST['pays']) and $country['id'] == 'FR') $selected = ' selected';
    	elseif (!empty($_POST['pays']) and $country['id'] == $_POST['pays']) $selected = ' selected';
    	$lstCountries->addOption(new optListOption($country[$colName], $country['id'], $selected));
    }
    unset($selected, $country);
     
    ##################################################################### FIN section CONTROLE #############################################################################
     
    ##################################################################### SECTION VUE ######################################################################################
     
    ?><!DOCTYPE html>
    <html>
     
    <head>
    	<meta charset="utf-8" />
    	<title>Edition d'un abonné</title>
    	<link rel="stylesheet" media="all" type="text/css" href="admin.css" />
    	<link rel="stylesheet" type="text/css" href="default_blue.css" />
    	<meta http-equiv="Pragma" content="no-cache" />
    	<meta http-equiv="Expires" content="-1" />
    </head>
     
    <body>
     
    <p>
    	<a href="../index.php">Retour à la page de connexion</a><br/>
    	<a href="../homeAbo.php">Retour à la page d'accueil</a><br/>
    	<a href="selectAbo.php">Editer un autre abonné</a><br/>
    </p>
     
    <h1>Edition d'un abonné</h1>
    <?php
    // Affichage des erreurs
    if (isset($errors)) {
    	displayErrors($errors);
    	unset($errors);
    }
     
    ?>
     
    <form method="post">
    	<fieldset><legend>Abonné</legend>
    		<label for="id">N° abonné</label><input type="text" id="id" name="id" value="<?= $id_abo; ?>" readonly="readonly" /><br/>
    		<label for="pseudo">Pseudo</label><input type="text" id="pseudo" name="pseudo" value="<?= setPostValue('pseudo'); ?>" maxlength="12" required /><br/>
    		<label for="client_nom">Nom abonné</label><input type="text" id="client_nom" name="client_nom" value="<?= setPostValue('client_nom'); ?>" maxlength="40" required /><br/>
    		<label for="courriel">Courriel</label><input type="text" id="courriel" name="courriel" value="<?= setPostValue('courriel'); ?>" maxlength="60" required /><br/>
    	</fieldset>
    	<fieldset><legend>Responsable</legend>
    		<label for="contact_nom">Nom</label><input type="text" id="contact_nom" name="contact_nom" value="<?= setPostValue('contact_nom'); ?>" maxlength="40" required /><br/>
    		<label for="contact_prenom">Prénom</label><input type="text" id="contact_prenom" name="contact_prenom" value="<?= setPostValue('contact_prenom'); ?>" maxlength="40" required /><br/>
    		<label for="adresse1">Adresse 1</label><input type="text" id="adresse1" name="adresse1" value="<?= setPostValue('adresse1'); ?>" maxlength="45" required /><br/>
    		<label for="adresse2">Adresse 2</label><input type="text" id="adresse2" name="adresse2" value="<?= setPostValue('adresse2'); ?>" maxlength="45" /><br/>
    		<label for="cp">Code postal</label><input type="text" id="cp" name="cp" value="<?= setPostValue('cp'); ?>" maxlength="10" required /><br/>
    		<label for="ville">Localité</label><input type="text" id="ville" name="ville" value="<?= setPostValue('ville'); ?>" maxlength="45" required /><br/>
    		<label for="pays">Pays</label>&nbsp;&nbsp;<?= $lstCountries; ?><br/>
    	</fieldset>
    	<fieldset><legend>Abonnement</legend>
    		<div class="aboMain">
    			<div class="aboChild">
    				<label for="init_abo">Date début</label><input type="text" id="init_abo" name="init_abo" value="<?= setPostValue('init_abo'); ?>" placeholder="<?= TODAY_SQL; ?>" /><br/>
    				<label for="banni">Verrouillé</label><input type="checkbox" id="banni" name="banni"<?php setPostValue('banni', 'checkbox'); ?> /><br/>
    			</div>
    			<div id="calendarMain" class="aboChild calendarMain"></div>
    		</div>
    	</fieldset>
    	<fieldset><legend>Gestion utilisateurs</legend>
    		<?php if (isset($lines)): ?>
    		<table class="users_tbl">
    			<tr>
    				<th>Code</th><th>Modifier</th><th>Supprimer</th>
    			</tr>
    			<?= $lines; ?>
    		</table>
    		<?php endif; ?>
    		<input type="submit" name="newUser" value="Nouveau" />
    	</fieldset>
    	<p><label></label><input type="submit" name="save" value="Enregistrer"/></p>
    </form>
     
    <p>
    	<a href="../index.php">Retour à la page de connexion</a><br/>
    	<a href="../homeAbo.php">Retour à la page d'accueil</a><br/>
    	<a href="selectAbo.php">Editer un autre abonné</a><br/>
    </p>
     
    <script>
    	var pickerDays		= <?= json_encode(JS_CAL_DAYS); ?>,
    		pickerMonthes	= <?= json_encode(JS_CAL_MONTHES); ?>;
    </script>
    <script src="jsSimpleDatePickr.2.1.js"></script>
    <script>
    //<![CDATA[
    var myCalendar = new jsSimpleDatePickr();
    myCalendar.CalAdd({
    'divId': 'calendarMain',
    'inputFieldId': 'init_abo',
    //'dateMask': 'JJ/MM/AAAA',
    'dateMask': 'AAAA-MM-JJ',
    'dateCentury': 20,
    'titleMask': 'M AAAA',
    'navType': '11',
    'classTable': 'jsCalendar',
    'classDay': 'day',
    'classDaySelected': 'selectedDay',
    //'monthLst': ['Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre'],
    'monthLst': <?= json_encode(JS_CAL_MONTHES); ?>,
    //'dayLst': ['D', 'L', 'M', 'M', 'J', 'V', 'S'],
    'dayLst': <?= json_encode(JS_CAL_DAYS); ?>,
    'hideOnClick': false,
    'showOnLaunch': false
    });
    //]]>
    var divAbo = document.getElementById('calendarMain');
    	fieldId= document.getElementById('init_abo');
    /*
    divAbo.addEventListener('blur', function(e) { // Ne fonctionne pas
    	//alert('calendarMain');
    	myCalendar.CalHide('calendarMain');
    }), false;
    fieldId.addEventListener('blur', function(e) { // Est appelé mais n'efface pas le calendrier
    	//alert('init_abo');
    	myCalendar.CalHide('calendarMain');
    }), false;
    */
    </script>
     
    </body>
    </html>

  4. #4
    Rédacteur/Modérateur
    Avatar de jreaux62
    Homme Profil pro
    Webdesigner
    Inscrit en
    août 2008
    Messages
    9 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Webdesigner
    Secteur : Arts - Culture

    Informations forums :
    Inscription : août 2008
    Messages : 9 812
    Points : 19 735
    Points
    19 735

    Par défaut

    Faute de débogage minimum, je ne dis rien... du tout.


    N.B. et (tu avais raison.), vu le nombre de fonctions et d'include,
    dont on ne sait rien... du tout,...
    ça ne sert à rien... du tout.
    "Si tu suis le chemin qui s'appelle « plus tard », tu arriveras à la place qui s'appelle « jamais »."
    François Camille Prévot (1910-1996), instituteur puis Directeur d'école et... mon grand-père.
    "Ce qui se conçoit bien s'énonce clairement. Et les mots pour le dire arrivent aisément."
    Nicolas Boileau-Despréaux (1636-1711).
    Mes tutos DVP
    Gestion-Affichage de Nouvelles
    Affichage en tableau HTML
    Fonctions de redimensionnement d'images

  5. #5
    Membre averti Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    juin 2011
    Messages
    201
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : juin 2011
    Messages : 201
    Points : 385
    Points
    385

    Par défaut

    Salut,
    j'ai essayé de reproduire le comportement avec Chrome 58 , Firefox 53 rien du tout, IE 11 Oui (quelque soit la position du curseur dans le champ).
    Avec Firefox la touche Backspace permet de revenir à la page précédente (et pas quand je suis dans input en readonly) si elle existe.
    Le problème ne concerne pas PHP, mais les navigateurs et des versions anciennes (Chrome et FF),
    un exemple de bug avec FF https://bugzilla.mozilla.org/show_bug.cgi?id=332345, qu'ils ont corrigé apparemment.
    Le bienfait n'est jamais perdu

  6. #6
    Membre régulier
    Homme Profil pro
    Ingénieur en électrotechnique retraité
    Inscrit en
    décembre 2008
    Messages
    185
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 65
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur en électrotechnique retraité

    Informations forums :
    Inscription : décembre 2008
    Messages : 185
    Points : 113
    Points
    113

    Par défaut

    Bonjour,
    J'ai fait différents tests et il s'agit d'un bug qui persiste sur IE11 mais pas sur FF. Je considère donc cette discussion comme résolue et j'en ai ouvert une autre plus explicite et mieux située ici.

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

Discussions similaires

  1. Quel est l'éditeur que vous recommandez pour PHP ?
    Par Lana.Bauer dans le forum EDI
    Réponses: 396
    Dernier message: 23/06/2016, 11h42
  2. Quel est le meilleur script PHP de portail (CMS) ?
    Par Lana.Bauer dans le forum CMS
    Réponses: 187
    Dernier message: 18/10/2012, 07h45
  3. L'avenir est-il au PHP ?
    Par Manolo dans le forum Langage
    Réponses: 468
    Dernier message: 11/02/2008, 18h54
  4. combobox et readonly
    Par Mac leod dans le forum C++Builder
    Réponses: 6
    Dernier message: 28/11/2002, 10h27

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