SubString o Explode Functions

Devo leggere un file di testo: cosě formattato:

host:localhost|port:3307|dbname:gestportalent|dbusers:entusers|dbpassword:""
<?
  $host       = "$host_file";
  $port         =  "$port_file";
  $dbname     = "$dbname_file";
  $dbuser     = "$dbuser_file";
  $dbpassword = "$dbpassword_file";

  /* Creo una varibile dove gli vengono passati i
  *  parametri di connessione al db
  *  @param $host:$port
  */
  $connectToHost = $host.":".$port;

$conn_db=mysql_connect($connectToHost,$dbuser,$dbpassword)
or die ("<span style='font-family: Verdana, Arial, Helvetica, sans-serif;color: #FF3300;text-decoration: none;font-size: 12px;'>Non riesco a connettermi a <b>$host:$port</b>,l'errore č: ".MySql_Error()."</span>");

mysql_select_db ($dbname,$conn_db)
or die ("<span style='font-family: Verdana, Arial, Helvetica, sans-serif;color: #FF3300;text-decoration: none;font-size: 12px;'>Non riesco a selezionare il db <b>$db<br>,l'errore č: ".MySql_Error()."</span>");
?>

, la domanda che vi vorrei porre č la seguente come faccio a capire capire quando finisce un parametro e nč inizia un'altro; es.: host:localhost|port:3307 oltre il fatto ke ho aggiunto delle descrizioni?

inviato 8 anni fa
EKELON77
X 0 X

per sezionare la stringa in un array di stringhe in base ad una carattere separatore si usa la funzione explode()

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Ok sono d'accordo, anche io avrei fatto cosě, posso fare explode per il |, ma host:localhost|port:3307 ecc..., come faccio a levare host: e port: prima di metterle sulle varibili di appoggio $host_file e $port_file; che dovrebbe contenere i valori dopo i :, per effettuare la connessione?  O0

risposto 8 anni fa
EKELON77
X 0 X

puoi ripetere nuovamente l'explode, questa volta per il carattere :

 :bye:

risposto 8 anni fa
Gianni Tomasicchio
X 0 X

Vorresti fare qualcosa del genere?

<?php
   $string = 'host:localhost|port:3307|dbname:gestportalent|dbusers:entusers|dbpassword:""';
   
   $tokens = explode('|', $string);
   $connection = Array();
   
   foreach ($tokens as $token) {
      list($var, $val) = explode(':', $token);
      if ($val == '""') {
         $val = '';
      }
      $connection[$var] = $val;
   }
   
   var_dump($connection);

l'ho scritto al volo senza interpretarlo, ma dovrebbe andare.

Dovrebbe restituirti un vettore formato da chiavi (host, port, dbnae) e i valori associati a quella chiava.

Ecco come si presenta la tua stringa dopo il processo

array
  'host' => string 'localhost' (length=9)
  'port' => string '3307' (length=4)
  'dbname' => string 'gestportalent' (length=13)
  'dbusers' => string 'entusers' (length=8)
  'dbpassword' => string '' (length=0)

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Ciao grazie innanzitutto per aver lo script, ma avrei alcune domande da farti sul codice:

<?php

   $string = 'host:localhost|port:3307|dbname:gestportalent|dbusers:entusers|dbpassword:""';

   $tokens = explode('|', $string);

   $connection = Array();

   foreach ($tokens as $token) {

      list($var, $val) = explode(':', $token);

      if ($val == '""') {

         $val = '';

      }

      $connection[$var] = $val;

   }

   var_dump($connection);

Volevo sapere adesso come faccio ad assegnare i valori tipo localhost a $host_file dopo aver eseguito il tuo script PHP; mi spiego meglio devo utilizzare $connection[$var] per i parametri di connessione, oppure $connection[$host_file]?

risposto 8 anni fa
EKELON77
X 0 X

Puoi accedere ai valori dell'array utilizzando come chiave l'identificativo prima dei duepunti :

$con = mysql_connect(
    $connection['host'] . ':' . $connection['port'],
    $connection['dbusers'],
    $connection['dbpassword']
);
$db = mysql_select_db($connection['dbname'];

cosa intendi dire con : "$connection[$host_file]" ?

Che valore ha la variabile $host_file?

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Nulla era come avevo definito:

$host       = $host_file;
  $port      =  $port_file;
  $dbname     = $dbname_file;
  $dbuser     = $dbuser_file;
  $dbpassword = $dbpassword_file;

 oppure

$host       =  $connection['host'];
  $port      =   $connection['port'];
  $dbname     =  $connection['dbname'];
  $dbuser     =  $connection['dbuser'];
  $dbpassword =  $connection['dbpassword'];

  O0 :bye: :)

risposto 8 anni fa
EKELON77
X 0 X

Puoi accedere ai valori dell'array utilizzando come chiave l'identificativo prima dei duepunti :

$con = mysql_connect(
    $connection['host'] . ':' . $connection['port'],
    $connection['dbusers'],
    $connection['dbpassword']
);
$db = mysql_select_db($connection['dbname'];

cosa intendi dire con : "$connection[$host_file]" ?

Che valore ha la variabile $host_file?

:bye:

come ho giŕ postato in precedenza io vorrei ottenere questo risultato senza utilizzare il var_dump($connection):

$host       =  $connection['host'];
  $port      =   $connection['port'];
  $dbname     =  $connection['dbname'];
  $dbuser     =  $connection['dbuser'];
  $dbpassword =  $connection['dbpassword'];

se lo levo posso utilizzare ugualmente le singole variabili dell'array?

risposto 8 anni fa
EKELON77
X 0 X

il var_dump serve unicamente a vedere se lo script funziona, a parte ciň non č necessario.

$host       =  $connection['host'];
  $port      =   $connection['port'];
  $dbname     =  $connection['dbname'];
  $dbuser     =  $connection['dbuser'];
  $dbpassword =  $connection['dbpassword'];
se lo levo posso utilizzare ugualmente le singole variabili dell'array?

Questo non serve a nulla č solo ridondanza di codice, meglo fare come ti ha suggerito trashofmasters

$con = mysql_connect(
    $connection['host'] . ':' . $connection['port'],
    $connection['dbusers'],
    $connection['dbpassword']
);
$db = mysql_select_db($connection['dbname']);

č piů intuitivo e usi meno variabili, poi dopo aver aperto la connessione puoi tranquillamente liberare memoria con una sola istruzione in luogo di 5, ovvero unset($connection)

Edit: Ho aggiunto ')' a mysql_select_db.

risposto 8 anni fa
Marco Grazia
modificato 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Si questo č vero quindi devo rimuovere i parametri di connessione in alto:

$host       =  $connection['host'];
  $port      =   $connection['port'];
  $dbname     =  $connection['dbname'];
  $dbuser     =  $connection['dbuser'];
  $dbpassword =  $connection['dbpassword'];
se lo levo posso utilizzare ugualmente le singole variabili dell'array?
Questo non serve a nulla č solo ridondanza di codice, meglo fare come ti ha suggerito trashofmasters
$con = mysql_connect(
    $connection['host'] . ':' . $connection['port'],
    $connection['dbusers'],
    $connection['dbpassword']
);

Ok rimane il fatto che devo prendere sempre da un file di testo questi dati? :crazy:

risposto 8 anni fa
EKELON77
modificato 8 anni fa
X 0 X

No ma che c'entra, li puoi prendere da dove vuoi, da un altro database, da un file di testo ovvio, da un file XML, da un file php da includere nelle pagine, come solitamente si fa.

Insomma c'č solo l'imbarazzo della scelta, ma la scelta dovrebbe anche eliminare i pericoli, quello che stai facendo tu č una cosa pericolosissima perché abiliti la lettura del file delle connessioni a chiunque ne conosca il nome e l'url, e credimi tramite Google č una fesseria  da realizzarsi ;)

Insomma al di la del problema di programmazione che stai riscontrando ora, stai anche realizzando qualcosa di molto pericoloso per la sicurezza.

I dati di connessione devono essere protetti meglio se non vuoi grane in futuro.

PS grazie Trash per la correzione, ho fatto dei copia e incolla veloci  ;D

risposto 8 anni fa
Marco Grazia
X 0 X

Quindi facendo il punto della situazione, il file con i parametri di connessione lo metto come include; ma cosě com'č solo testo e non andrebbe a finire in un array, perchč per fare ciň devo appoggiarmi su una variabile dove vi č contenuto la stringa completa; da trattare con explode...!!!  :coolsmiley: :bye:

risposto 8 anni fa
EKELON77
X 0 X

non ci siamo per niente.   :buck:

perchč devi avere i dati di connessione in una stringa anzichč in un array nel file di configurazione da includere?

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

non ci siamo per niente.   :buck:

perchč devi avere i dati di connessione in una stringa anzichč in un array nel file di configurazione da includere?

Non capisco mi puoi fare un esempio ?  :angel:

include ('ConfigDb.txt'); 
$string = $file

dentro la variabile file mi aspetto di avere: host:localhost|port:3307|dbname:gestportalent|dbusers:entusers|dbpassword:"" che ovviamente ho preso dal file che ho incluso in precedenza, spero di essere stato piů chiaro, comunque se ci sono problemi la cablo nel codice come ho sempre fatto.

risposto 8 anni fa
EKELON77
modificato 8 anni fa
X 0 X

immagina questo scenario: http://tuosito.com/ConfigDb.txt.

sai cosa intendo?

che posso leggere il tuo file.

Io trovo decisamente inutile avere un file di testo come configurazione per i seguenti motivi

  • I dati sono alla mercé di tutti
  • I dati hanno bisogno di essere processati per essere utilizzati

Una soluzione č quella che ti č stata proposta piů volte da Marcolino, utilizzare un array.

Eccoti l'esempio, in modo che non ci perdi piů la testa ;D:

//file: ConfigDb.php
$configurazione = Array(
    'database'  => 'mio_database',
    'username' => 'username_database',
    'password' => 'password_database',
    'port'          => 3306,
    'host'         => 'localhost'
);
//file : Connessione.php
include 'ConfigDb.php';
    $connection = mysql_connect(
    $configurazione['host'] . ':' . $configurazione['port'],
    $configurazione['username'],
    $configurazione['password']);
if ($connection) {
   if (!mysql_select_db($configurazione['database']) {
       die('Database non trovato');
   } 
} else {
     die('Errore connessione');
}

includendo Connessione.php nei tuoi script avrai accesso al database, e la risorsa č contenuta nella variabile $connessione.

esempio di utilizzo:

//file : index.php
include 'Connessione.php';

$sql = "SELECT * FROM utenti";

if ($query = mysql_query($sql)) {
    echo 'query eseguita, ora trova un bel modo di usare il resultset!';
} else {
   die ('Query fallita, incluso il file di configurazione? errore nella query? errore di connessione?');
}

Per altre questioni o dubbi chiedi ;D

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
modificato 8 anni fa
X 0 X

Attenzione :

include (_once) e require (_once) sono dei costrutti non delle funzioni, quindi non hanno bisogno delle parentesi.

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Vorresti fare qualcosa del genere?

<?php
   $string = 'host:localhost|port:3307|dbname:gestportalent|dbusers:entusers|dbpassword:""';
   
   $tokens = explode('|', $string);
   $connection = Array();
   
   foreach ($tokens as $token) {
      list($var, $val) = explode(':', $token);
      if ($val == '""') {
         $val = '';
      }
      $connection[$var] = $val;
   }
   
   var_dump($connection);

l'ho scritto al volo senza interpretarlo, ma dovrebbe andare.

Dovrebbe restituirti un vettore formato da chiavi (host, port, dbnae) e i valori associati a quella chiava.

Ecco come si presenta la tua stringa dopo il processo

array
  'host' => string 'localhost' (length=9)
  'port' => string '3307' (length=4)
  'dbname' => string 'gestportalent' (length=13)
  'dbusers' => string 'entusers' (length=8)
  'dbpassword' => string '' (length=0)

:bye:

quindi mi stai dicendo che la funzione di explode che hai scritto per me non č utilizzabile perchč se devo fare un array come mi avete ripetuto tu e marcolino, dovrň sempre mettere dei parametri fissi solo che a differenza di prima era stringhe adesso sono array?  ^-^

risposto 8 anni fa
EKELON77
X 0 X

La funzione che ti ho fatto praticamente non serve, perchč un array (č corretto utilizzarlo in questa maniera :) ) č invisibile al di fuori dal codice php, a meno di outputtarlo, e una stringa sarebbe stata inutile per la configurazione, in quanto avrebbe portato comunque al risultato finale, ovvero un array.

:bye:

risposto 8 anni fa
Andrea Turso
Andrea Turso
86
X 0 X

Ti ringrazio di aver precisato.  O0

P.S.: Alla prossima...!!!

risposto 8 anni fa
EKELON77
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda