Problemi di Database

Questa sezione contiene alcune delle domande più comuni a proposito della relazione fra PHP e i database. Sì, PHP virtualmente può accedere a qualsiasi database oggi disponibile.

Ho sentito che è possibile accedere al Server Microsoft SQL da PHP. Come?

Sulle macchine Unix puoi usare PDO_ODBC oppure Unified ODBC API.

Sulle macchine Windows puoi anche usare PDO_SQLSRV oppure SQLSRV.

Guarda anche la risposta alla prossima domanda.

Posso accedere ai database Microsoft Access?

Sì. Hai già tutti gli strumenti che ti servono se stai utilizzando Windows 9x/Me o NT/2000. Qui hai a disposizione i driver ODBC e ODBC di Microsoft per i database Microsoft Access.

Se stai utilizzando PHP su una Unix box e vuoi interagire con MS Access su una Windows box, avrai bisogno dei driver ODBC di Unix. » OpenLink Software ha dei driver ODBC basati su Unix che possono aiutarti in questo senso.

Un'altra alternativa è quella di usare un server SQL che ha i driver ODBC di Windows e utilizzare questo per memorizzare i dati, che puoi successivamente accedere da Microsoft Access (usando gli ODBC) e PHP (usando i driver inclusi), oppure puoi usare un formato di file intermedio che sia leggibile sia da Access che da PHP, come ad esempio flat files o database dBase. Su questo punto, Tim Hayes di OpenLink software scrive:

Usare un altro database come intermediario, non è una buona idea, quando puoi usare gli ODBC da PHP direttamente sul tuo database (ad esempio con i driver di OpenLink). Se hai bisogno di usare un formato di file intermedio, OpenLink ha appena rilasciato "Virtuoso" (un motore virtuale di database) per NT, Linux e altre piattaforme Unix. Per favore, visita il nostro » sito web per il download gratuito.

Una opzione che ha dimostrato di avere successo è quella di usare MySQL e i suoi driver MyODBC su Windows e sincronizzare i database. Steve Lawrence scrive:

  • Installa MySQL sulla tua piattaforma seguendo le istruzioni di MySQL. Le ultime disponibili su » http://www.mysql.com/ Non sono richieste speciali configurazioni, eccetto quando imposti il database, e configuri l' account dell' utente, dovresti mettere % nel campo host, oppure il nome host del computer Windows con cui vuoi accedere a MySQL. Prendi nota del nome del tuo server, della username e della password.
  • Scarica il driver MyODBC per Windows dal sito MySQL. Installalo sulla tua macchina Windows. Puoi eseguire il test di questa operazione con le utilities incluse in questo programma.
  • Crea una user oppure un dns di sistema nel tuo ODBC administrator, situato nel pannello di controllo. Crea un nome dns, inserisci il tuo hostname, username, password, porta, ecc. per il tuo database MySQL configurato al punto 1.
  • Installa Access con una installazione completa, in questo modo sarai sicuro di aver ottenuto i giusti add-ins... Perlomeno avrai bisogno del supporto ODBC e il gestore di tabelle collegato.
  • Adesso la parte divertente! Crea un nuovo database di accesso. Nella finestra della tabella, clicca col tasto destro e seleziona Link Tables, oppure sotto l' opzione file menu, seleziona Get External Data e poi Link Tables. Quando esce fuori il box del file browser, seleziona i file del tipo: ODBC. Seleziona i dns di Sistema e il nome del tuo dns creato allo step 3. Seleziona la tabella da collegare, seleziona OK e fatto! Adesso puoi aprire la tabella e aggiungere/cancellare/modificare i dati sul tuo server MySQL! Puoi anche costruire query, importare/esportare tabelle su MySQL, costruire form e report, ecc.

Trucchi e suggerimenti:

  • Puoi costruire le tue tabelle in Access ed esportarle su MySQL, poi ricollegarle in direzione opposta. Questo velocizza la creazione delle tabelle.
  • Quando crei le tabelle in Access, devi aver definito una chiave primaria per avere accesso in scrittura alla tabella in Access. Accertati di aver creato una chiave primaria in MySQL prima di effettuare i collegamenti ad Access.
  • Se cambi una tabella in MySQL, devi ri-collegarla ad Access. Vai a tools>add-ins>gestore delle tabelle collegate, incrocialo al tuo DSN ODBC, e seleziona la tabella da ri-collegare da questo punto. Puoi anche spostare il sorgente del tuo dns, seleziona giusto il checkbox "always prompt for new location", prima di cliccare su OK.

Perchè si scoraggia l' utilizzo dell' estensione MySQL (ext/mysql) che ho usato per più di 10 anni? E' stata deprecata? Cosa posso usare al suo posto? Come faccio a migrare?

Ci sono tre estensioni MySQL, come descritto nella sezione Scegliere una API MySQL. Non bisognerebbe usare la API vecchia, è stata deprecata a partire da PHP 5.5.0 ed è stata spostata su PECL a partire da PHP 7.0.0. Ti incoraggiamo fortemente a scrivere il tuo nuovo codice o con mysqli oppure con PDO_MySQL.

In questo momento gli script di migrazione non sono ancora disponibili, nonostante la API di mysqli contenga allo stesso tempo una API procedurale e una API OPP. La versione procedurale è simile alla ext/mysql.

Non è possibile mixare le estensioni. Quindi, ad esempio, passare una connessione mysqli a PDO_MySQL o ad ext/mysql non funziona.

Perchè ottengo un errore che suona più o meno così: "Warning: 0 is not a MySQL result index in <file> on line <x>" oppure "Warning: Supplied argument is not a valid MySQL result resource in <file> on line <x>"?

Stai cercando di usare un identificatore di risultato che è 0. Lo 0 indica che la tua richiesta è fallita per qualche motivo. Devi controllare gli errori dopo aver inviato la tua richiesta e prima del tentativo di usare le informazioni restituite dall'identificatore di risultato. Il modo corretto di farlo è con codice simile al seguente:

<?php

$result
= mysql_query("SELECT * FROM tables_priv");
if (!
$result) {
echo
mysql_error();
exit;
}
?>
or
<?php

$result
= mysql_query("SELECT * FROM tables_priv")
or die(
"Bad query: " . mysql_error());
?>

add a note add a note

User Contributed Notes 2 notes

up
10
knb at gfz-potsdam dot de
20 years ago
This is a crucial piece of information for SYBASE users:

If you are using the free, but old, 11.x client libs from sybase,
then compile with option  "--with-sybase-ct=$SYBASE"
substitute $SYBASE with the appropriate directory name.

option --with-sybase (without ct) can somehow be used to talk to old MS-SQL servers, but only with the 11.x client libs.

If you are using free, or have legally obtained, 12.x client libs from sybase, then compile with option  "--with-sybase-ct=$SYBASE/$SYBASE_OCS"
substitute $SYBASE/$SYBASE_OCS with the appropriate directory name.
up
-5
doug at unlikelysource dot com
7 years ago
To enable SQL Server access from ubuntu 16.04:

* Run these commands:
```
sudo curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list > mssql-release.list
sudo mv mssql-release.list /etc/apt/sources.list.d
sudo apt-get update
sudo ACCEPT_EULA=Y apt-get install msodbcsql unixodbc-dev
sudo apt-get install php7.1-dev
sudo apt-get install autoconf
sudo pecl install pdo_sqlsrv-4.1.6.1
```

*  Confirm ODBC driver installation:
```
odbcinst -q -d -n "ODBC Driver 13 for SQL Server"
```

* Update the php.ini file: run` php --ini` to find the path to your php.ini file
* Add this line to /path/to/php.ini
```
extension=pdo_sqlsrv.so
```
* Run `php -i` to confirm SQLSRV support was added
* NOTE: extensions (on my computer) were installed here:
`/usr/local/lib/php/extensions/no-debug-non-zts-20160303/`

* Test user access directly on the Windows server running MSSQL:
```
sqlcmd -S ip_address -U username -P password -d database -q "select * from table_name"
```
* On the Windows server: open port 1433 in your firewall

* Install the FreeTds utils to test the connection:
```
sudo apt-get install freetds-bin
tsql -H mssql.host.ip.address -U username -P password -D database -p 1433
```

* Formulate the correct DSN (Data Source Name):
    See: http://php.net/manual/en/ref.pdo-sqlsrv.connection.php

* Sample PHP Code:
```
<?php
// Database params
$tcp  = '192.168.3.126';
$port = 1433;
$user = "test";
$password = "Password123";
$database = "test";

// Open connection
try {
   
// Database connect -- use one of the two statements below
   
$dsn 'sqlsrv:Server=tcp:' . $tcp . ',' . $port . ';Database=' . $database;
   
$dbh = new PDO( $dsn, $user, $password, array());
   
// SQL prepare
   
$sql = "SELECT * FROM prospects";
   
$sth = $dbh->prepare($sql);
   
// Execute
   
$sth->execute();
   
// Fetch results
   
$row = $sth->fetch(PDO::FETCH_ASSOC);
    if (
$row) {
       
$output = '<pre>';
       
$output .= implode("\t", array_keys($row)) . PHP_EOL;
       
$output .= implode("\t", $row) . PHP_EOL;
        while (
$row = $sth->fetch(PDO::FETCH_NUM)) {
           
$output .= implode("\t", $row) . PHP_EOL;
        }
    }
} catch (
PDOException $e) {
   
$output .= $e->getMessage();
}
$output .= '</pre>';
echo
$output;
```
To Top