Errno 150 - Cant' create table

Ciao Gianni,

premetto che sto usando la versione 2.6.4pl1; vorrei sapere perchè se carico il file di seguito riportato, mi si ripresenta di nuovo l'errore 150 (Cant' create table . . ..) che ho aggirato (grazie al tuo suggerimento) in quanto venivano create delle tabella pirma di atre e le chiavi esterne si riferivano a tabelle non ancora create; Ma qui la situazione è diversa, almeno credo:

Ecco il file (chiamato Definizione Tabelle.txt, dimensione: 2,90 KB):

########################################################################

#                                                                      #

#          Progetto di "Basi di Dati e Sistemi Informativi"            #

#                 Roberto Cuccurese - Mat. 566/955                     #

#                          A.A. 2004/2005                              #

#                                                                      #

########################################################################

#

# Questo file genera automaticamente la struttura del D.B. "PIANI_DI_STUDIO"

#DROP DATABASE PIANI_DI_STUDIO;

CREATE DATABASE PIANI_DI_STUDIO;

USE PIANI_DI_STUDIO;

CREATE TABLE CORSI

(

 Cod_Laurea CHAR(4) NOT NULL,

 Descrizione VARCHAR(10) NOT NULL,

 PRIMARY KEY(Cod_Laurea)

) ENGINE=INNODB;

CREATE TABLE STUDENTI

(

 Cod_L VARCHAR(10) NOT NULL,

 Matricola VARCHAR(10) NOT NULL,

 Cod_Piano INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Nome VARCHAR(20) NOT NULL,

 Cognome VARCHAR(20) NOT NULL,

 Data_N DATE NOT NULL,

 Indirizzo VARCHAR(50) NOT NULL,

 Telefono VARCHAR(15) NOT NULL,

 Sesso ENUM ('M','F') NOT NULL DEFAULT 'M',

 UNIQUE (Matricola),

 PRIMARY KEY (Cod_Piano),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE ESAMI

(

 Cod_L VARCHAR(10) NOT NULL,

 Cod_Esame CHAR(3) NOT NULL,

 Titolo VARCHAR(30) NOT NULL,

 Contenuti TEXT NOT NULL,

 Tipo_Attivita VARCHAR(8) NOT NULL,

 Prova_Fin ENUM ('E','K','C') NOT NULL DEFAULT 'E',

 CFU SMALLINT(2) NOT NULL,

 Tipo ENUM ('O','F') NOT NULL DEFAULT 'O',

 PRIMARY KEY (Cod_L,Cod_Esame),

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE ANNI

(

 Cod_E CHAR(3) NOT NULL,

 Anno ENUM('1','2','3') NOT NULL,

 PRIMARY KEY (Cod_E,Anno),

 FOREIGN KEY (Cod_E) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PIANI

(

 Mat CHAR(10) NOT NULL,

 Cod_P INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Cod_Esami CHAR(3) NOT NULL,

 Anno ENUM ('1','2','3') NOT NULL,

 Data_P DATE,

 Voto SMALLINT(2) CHECK (Voto BETWEEN 18 AND 30),

 Lode ENUM ('S','N') DEFAULT 'N',

 PRIMARY KEY (Mat,Cod_P,Cod_Esami),

 FOREIGN KEY (Mat) REFERENCES STUDENTI(Matricola)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_P) REFERENCES STUDENTI(Cod_Piano)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Esami) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

CREATE TABLE PROPEDEUTICI

(

 Cod_Esa CHAR(3) NOT NULL,

 Cod_Prop CHAR(3) NOT NULL,

 PRIMARY KEY (Cod_Esa,Cod_Prop),

 FOREIGN KEY (Cod_Esa) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Prop) REFERENCES ESAMI(Cod_Esame)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

Vengono create normalmente le prime 3 tabelle, l'errore viene fornito nella tabella anni a causa del FOREIGN KEY, ma per me non sembrano esserci errori.

Ciao e grazie

inviato 11 anni fa
noems
X 0 X

Inoltre se carico questo file in maniera corretta ottengo questa cosa:

Cod_Laurea | Matricola | Cod_Piano |

       L1             4454               1

       L1             4124               2

       L1             4443               3

       L1             4254               4

       L1             4154               5

       L1             1454               6

       L1             4444               7

       L1             5484               8

       L2             1234               1

       L2             1451               2

       L2             3444               3

       L2             4555               4

       L2             4674               5

       L2             4498               6

       L2             4964               7

io credo di si (da quello che mi hai detto precedentmente), CONFERMI?

risposto 11 anni fa
noems
X 0 X

Inoltre se carico questo file in maniera corretta ottengo questa cosa:

Cod_Laurea | Matricola | Cod_Piano |

       L1             4454               1

       L1             4124               2

       L1             4443               3

       L1             4254               4

       L1             4154               5

       L1             1454               6

       L1             4444               7

       L1             5484               8

       L2             1234               1

       L2             1451               2

       L2             3444               3

       L2             4555               4

       L2             4674               5

       L2             4498               6

       L2             4964               7

io credo di si (da quello che mi hai detto precedentmente), CONFERMI?

non ho capito il nesso con il primo messaggio  ::)

comunque l'errore nella costruzione delle tabelle sta sempre nelle chiavi esterne. Infatti l'attributo esterno deve possedere un indice nella sua tabella. Poiché nel tuo caso Cod_Esame non è chiave primaria (lo è la coppia) allora devi costruire un indice ad hoc: ti basta aggiungere alla sua tabella "KEY `Cod_Esame` (`Cod_Esame`)"

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ho inserito questa linea all'interno d :wallbash:ella definizione della tabella "esami"

KEY `Cod_Esame` (`Cod_Esame`)

e come per magia tutto è andato bene (grazie del consiglio), ma visto che sono un pò cocciuto   :wallbash: e non ho afferrato per niente il concetto, potresti rispiegarmi il perchè di questa cosa e di quella linea di codice! Il nesso con il primo messaggio è il seguente:

1) se carico in maniera corretta il file "Definizione Tabelle"  (citato nel primo messaggio), quindi con quelle definizioni dei dati,

2) ottengo una situazione come quella mostrata nel secondo messaggio (mi riferisco alla tabella "STUDENTI")

Questo era quanto volevo intendere nel secondo messaggio,spero di essere stato chiaro.

risposto 11 anni fa
noems
X 0 X

MySQL conserva i dati delle tabelle in alcuni files. Per garantire un accesso immediato a questi dati MySQL ha bisogno di un indice, un po' come avviene in un libro, altrimenti dovrebbe scorrere tutto il file per trovare le informazioni richieste. Questa necessità si lega alla teoria dei database relazionali che prevedono l'esistenza di una chiave primaria (PK) per ogni tabella. MySQL infatti indicizza questi attributi, poiché sono (o dovrebbero essere) quelli che effettivamente distinguono una tupla da un'altra.

Quando si effettua una SELECT e nella clausola WHERE si fanno delle imposizioni sulla PK, MySQL è subito in grado di restituire le tuple corrette. Gli basta consultare l'indice della tabella per ottenere la posizione dei dati richiesti all'interno del file.

Se invece una SELECT non usa la chiave primaria nella clausola WHERE allora MySQL è costretto a leggersi tutto il file dei dati per trovare le tuple giuste richieste dalla query.

Qualcosa di simile accade quando una tabella possiede delle chiavi esterne (FK). Immagina cosa succede quando vuoi cancellare una tupla da una tabella A legata ad altre tabella (B, C, E, ...) da FK. MySQL deve prima cercare le tuple di A che corrispondono alla richiesta effettuata. Poi deve andare nelle tabelle B, C, E, ... per cercare le tuple collegate.

Questa seconda ricerca può essere parecchio onerosa pertanto MySQL vuole un aiuto: vuole che le FK, sia nella tabella referenziante, sia nelle tabelle referenziate, abbiano un indice. Come ti ho spiegato prima questo indice velocizzerà enormemente le operazioni di ricerca.

Normalmente non ci si accorge di questa necessità poiché le FK spesso puntano a delle PK, che quindi hanno giù degli indici. Inoltre MySQL costruisce spontaneamente un indice per l'attributo della chiave A interessato dal legame di FK.

Quindi solo nei casi in gli l'attributi referenziati nelle tabelle B,C, E, ... non sono PK allora devono essere costruiti espressamente degli ulteriori indici.

Quando una PK è costituita da più attributi (atr1, atr2, atr3, ...), MySQL costruisce un indice di tipo Capitolo - Paragrafo - Sottoparagrafo  - ... dove il primo attributo della chiave è come se fosse il titolo di un capitolo, il secondo attributo è come un paragrafo, ecc.

Questo significa che un indice del genere funziona solo se si cerca un capitolo, oppure se si cerca un paragrafo sapendo a che capitolo appartiene, oppure se si cerca un sottoparagrafo sapendo paragrafo e capitolo di appartenenza.

Questo per spiegare come mai per MySQL non è sufficiente che le tabelle B, C, E, ... abbiano gli attributi referenziati all'interno di PK quando non sono, nell'ordine di definizione della PK, al primo posto. In altre parole se gli attributi referenziati non sono "capitoli" allora, nonostante appartengono ad una PK, non vanno bene e per loro è necessario costruire un indice a parte.

Spero di essermi spiegato  :o

__________________________________________

Per la seconda domanda, non credo che funzionerà come ti aspetti poiché hai messo nella tabella STUDENTI come chiave primaria solo Cod_Piano, che pertanto si incrementerà ad ogni inserimento, non curante del valore di Cod_L. Se vuoi ottenere quel risultato devi avere la coppia Cod_L, Cod_Piano come PK

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
modificato 11 anni fa
X 0 X

Ho provato a fare come mi hai suggerito e cioè così:

CREATE TABLE STUDENTI

(

 Cod_L CHAR(4) NOT NULL,

 Matricola VARCHAR(10) NOT NULL,

 Cod_Piano INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,

 Nome VARCHAR(20) NOT NULL,

 Cognome VARCHAR(20) NOT NULL,

 Data_N DATE NOT NULL,

 Indirizzo VARCHAR(50) NOT NULL,

 Telefono VARCHAR(15) NOT NULL,

 Sesso ENUM ('M','F') NOT NULL DEFAULT 'M',

 UNIQUE (Matricola),

 PRIMARY KEY (Cod_L,Cod_Piano),  <----------------

 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)

  ON DELETE CASCADE

  ON UPDATE CASCADE

) ENGINE=INNODB;

ma mi viene restituito questo errore:

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

Allora ho provato ad invertire gli attributi e, il problema non si presenta più;

Dopo di che, ho caricato il file contenente tutti i corsi (conclusasi con successo) ;

Ho selezionato il DB "PIANI_DI_STUDIO";

Poi ho provato a fare 2 inserimenti come questi:

INSERT INTO STUDENTI VALUES ('CL01','566/000955','','Roberto','Cuccurese','1983-07-22','Via Prova 123','081/7263741','M')

INSERT INTO STUDENTI VALUES ('CL02','566/000957','','Roberto','Cuccurese','1983-07-22','Via Prova 123','081/7263741','M')

e se vado a mostrare il contenuto della tabella STUDENTI ottengo questo:

CL01 | 566/000955 | 1 | Roberto | Cuccurese | 1983-07-22 | Via Prova 123 ecc.

CL02 | 566/000957 | 2 | Roberto | Cuccurese | 1983-07-22 | Via Prova 123 ecc.

il che non è quello che volevo (invece di 2 per l'attributo Cod_Piano, nella seconda tupla ci dovrebbe essere 1);

Ripeto che ho inserito Cod_L come chiave primaria ma:

1) PRIMARY KEY (Cod_L,Cod_Piano) ottengo l'errore riportato sopra (#1075)

2) PRIMARY KEY (Cod_Piano,Cod_L) ottengo le 2 tuple precedenti

Aiutami, sto perdendo un sacco di tempo per queste cosa...

Ciao e Grazie

risposto 11 anni fa
noems
X 0 X

#1075 - Incorrect table definition; there can be only one auto column and it must be defined as a key

questo errore la dice lunga.... ci può essere solo una "autocolonna" e deve essere definita come chiave. In poche parole le tabelle InnoDB non supportano attributi AUTO_INCREMENT che non siano chiavi oppure il primo attributo di una chiave (se questa è composta da più attributi. Solo le MyISAM e le BDB lo possono fare.

Pertanto con le InnoDB non puoi ottenere questo risultato  :dunno:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ho provato sia il tipo MyISAM che quello BDB; il secondo mi dà lo stesso errore

dello INNODB, mentre MyISAM va benissimo.

CIAO E GRAZIE

risposto 11 anni fa
noems
X 0 X

Ricorda che con le MyISAM non ci sono FK e transazioni!

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Infatti mi di nuovo l'errore can't create table piani....

come posso fare per ovviare a questo problema:

CREATE TABLE CORSI
(
 Cod_Laurea CHAR(4) NOT NULL,
 Descrizione VARCHAR(70) NOT NULL,
 
 PRIMARY KEY(Cod_Laurea)
) ENGINE=INNODB;

CREATE TABLE STUDENTI
(
 Cod_L CHAR(4) NOT NULL,
 Matricola VARCHAR(10) NOT NULL,
 Cod_Piano INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 Nome VARCHAR(20) NOT NULL,
 Cognome VARCHAR(20) NOT NULL,
 Data_N DATE NOT NULL,
 Indirizzo VARCHAR(50) NOT NULL,
 Citta VARCHAR(50) NOT NULL,
 Telefono VARCHAR(15) NOT NULL,
 Sesso ENUM ('M','F') NOT NULL DEFAULT 'M',

 UNIQUE (Matricola),
 PRIMARY KEY (Cod_L,Cod_Piano),
 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)
  ON DELETE CASCADE 
  ON UPDATE CASCADE
) ENGINE=MyISAM;

CREATE TABLE ESAMI 
(
 Cod_L CHAR(4) NOT NULL,
 Cod_Esame INT(5) NOT NULL,
 Titolo VARCHAR(30) NOT NULL,
 Contenuti TEXT NOT NULL,
 Tipo_Attivita VARCHAR(8) NOT NULL,
 Prova_Fin ENUM ('E','K','C') NOT NULL DEFAULT 'E',
 CFU SMALLINT(2) NOT NULL,
 Tipo ENUM ('O','F') NOT NULL DEFAULT 'O',

 PRIMARY KEY (Cod_L,Cod_Esame),
 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)
  ON DELETE CASCADE 
  ON UPDATE CASCADE,
  KEY `Cod_Esame` (`Cod_Esame`)
) ENGINE=INNODB;

CREATE TABLE ANNI
(
 Cod_L CHAR(4) NOT NULL,
 Cod_E INT(5) NOT NULL,
 Anno ENUM('1','2','3') NOT NULL,

 PRIMARY KEY (Cod_L,Cod_E,Anno),
 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)
  ON DELETE CASCADE 
  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_E) REFERENCES ESAMI(Cod_Esame)
  ON DELETE CASCADE
  ON UPDATE CASCADE
) ENGINE=INNODB;

CREATE TABLE PIANI 
(
 Mat CHAR(10) NOT NULL,
 Cod_P INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
 Cod_Esami INT(5) NOT NULL,
 Anno ENUM ('1','2','3') NOT NULL,
 Data_P DATE,
 Voto SMALLINT(2) CHECK (Voto BETWEEN 18 AND 30),
 Lode ENUM ('S','N') DEFAULT 'N',

 PRIMARY KEY (Mat,Cod_P,Cod_Esami),
 FOREIGN KEY (Mat) REFERENCES STUDENTI(Matricola)
  ON DELETE CASCADE
  ON UPDATE CASCADE,
 FOREIGN KEY (Cod_P) REFERENCES STUDENTI(Cod_Piano)
  ON DELETE CASCADE
  ON UPDATE CASCADE,

 FOREIGN KEY (Cod_Esami) REFERENCES ESAMI(Cod_Esame)
  ON DELETE CASCADE
  ON UPDATE CASCADE
) ENGINE=INNODB;

CREATE TABLE PROPEDEUTICI
(
 Cod_L CHAR(4) NOT NULL,
 Cod_Esa INT(5) NOT NULL,
 Cod_Prop INT(5) NOT NULL, 

 PRIMARY KEY (Cod_L,Cod_Esa,Cod_Prop),
 FOREIGN KEY (Cod_L) REFERENCES CORSI(Cod_Laurea)
  ON DELETE CASCADE 
  ON UPDATE CASCADE,
 
 FOREIGN KEY (Cod_Esa) REFERENCES ESAMI(Cod_Esame)
  ON DELETE CASCADE
  ON UPDATE CASCADE,
 
 FOREIGN KEY (Cod_Prop) REFERENCES ESAMI(Cod_Esame)
  ON DELETE CASCADE
  ON UPDATE CASCADE
) ENGINE=INNODB;

Sto da più di una settimane cercando di rislvere queste cose.....

Mi scuso per la lunghezza dei codici che sto inviando,ma purtoppo sono le circostanze

che lo richiedono.

GRAZIE

risposto 11 anni fa
noems
X 0 X

La tabella "piani" non può avere delle FK che referenziano una tabella MyISAM.

Hai 2 strade: o fai tutto con le MyISAM così da sfruttare la maggiore flessibilità dei campi AUTO_INCREMENT ma rinunciando alle FK ed alle transazioni. Oppure fai tutto con le InnoDB ma dovrai realizzare personalmente il sistema di di AUTO_INCREMENT per gli attributi non chiave.

Queste sono le alternative  :dunno: Io ti consiglio la seconda.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Anch'io scelgo la seconda......

dovrei farei prima dei controlli per vedere se il Cod_L è già stato inserito, se è già stato inserito

1) devo ragruppare per Cod_L e

2) prendere il valore massimo, raggiunto in quel preciso stato della nostra base di dati, dell'attributo Cod_P per il generico Cod_L (inserito dall'utente nel form)

Se Cod_L non è stato inserito, restiuisco un messaggio di errore, dicendo che il corso di laurea inserito non è presente nel database.

Quindi implementato diventa:

<?

     //Cod_L viene passato dall'utente nel form
     $query="SELECT * FROM CORSI WHERE (Cod_L = $Cod_L);
     $ris=mysql_query($query,$Connessione) or die....;
     $righe=mysql_num_rows($ris);

     if ($righe == 0)      
        die("Spiacente,ma il codice di corso di laurea $Cod_L inserto, non è presente 
                nel db!");
     else
      {
        $query="SELECT MAX(Cod_Piano) AS $Max_Cod_P FROM STUDENTI WHERE 
                      (Cod_L = $Cod_L)";
        $ris=mysql_query($query,$Connessione) or die....;
        $Max_Cod_P++;
        $query="INSERTI INTO STUDENTI VALUES ('Cod_L', ecc....); 
                      (Cod_L = $Cod_L)";
       }
 ?>

Mi dai un parere su questo codice, e magari saresti così gentile da dargli un'cchiata dal punto di vista degli errori (sintattici e semantici)

GRAZIE

risposto 11 anni fa
noems
X 0 X

il codice che hai postato non funzionerebbe...

Innanzitutto la prima query va bene solo perché CORSI è una tabella con poche tuple. Se non fosse stato così sarebbe stato meglio usare una SELECT COUNT(*) che restituisce il numero delle righe, non le righe stesse che avrebbero richiesto molta più memoria.

La seconda query invece non funziuona proprio perché dopo averla eseguita non hai fatto la fetch dei risultati, ovvero la loro estrazione. Prova a dare unìocchiata al codice che ho riportato in questo messaggio:

http://www.phpnews.it/forum/index.php?topic=106.msg531#msg531

Nella variabile $Max_Cod_P non verrà inserito il valore restituito dalla query! Dovrai inserirlo tu con l'operazione di fetch.

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X

Ho fatto come mi hai suggerito il risultato è questo:

    <?

      $query="SELECT * FROM CORSI WHERE Cod_Laurea = '$Cod_L'";

      $ris= mysql_query($query,$Connessione) or die("Errore nella query: " . mysql_error());

      $righe=mysql_num_rows($ris);

      if ($righe == 0)

        die("Spiacente, ma il codice di corso di laurea $Cod_L inserito non è presente nel db!");

      else

       {

        $query="SELECT MAX(Cod_Piano) FROM STUDENTI WHERE Cod_L = '$Cod_L'";

        $ris= mysql_query($query,$Connessione) or die("Errore nella query: " . mysql_error());

        $Max_Cod_P = mysql_fetch_array($ris,MYSQL_NUM);

        $Max_Cod_P[0]++;         

        $query="INSERT INTO STUDENTI VALUES ('$Cod_L','$Matricola','$Max_Cod_P[0]','$Nome','$Cognome','$Data_N','$Indirizzo','$Citta','$Telefono','$Sesso')";      

        $ris= mysql_query($query,$Connessione) or die("Errore nella query: " . mysql_error());

       }

     ?>

ovviamente tutte le tabelle sono state dichiarate come INNNODB; io ho usato mysql_fetch_array, che restituisce

un vettore dove l'elemento che a me serve viene memorizzato in posizione 0.

Vorrei fare lo stesso per la prima query (quindi non vorrei usare mysql_num_rows) come posso fare usando

mysql_fetch_assoc? Non ho capito il valore ritornato dalla SELECT dove viene messo quando uso mysql_fetch_assoc, mentre

con mysql_fetch_array (da quello che ho capito) viene messo (nel mio caso) nell'array $Max_Code_P alla posizione 0;

Inoltre cosa indica la variabile MYSQL_NUM? Se uso mysql_fetch_assoc e eseguo un query del tipo "SELECT * ecc.."

oppure "SELECT funz_di_aggregaz()...", i risultati di queste query vengono poste sempre nella stessa variabile?

Se è si quale?

GRAZIE

risposto 11 anni fa
noems
X 0 X

Se fai una query del tipo

SELECT COUNT(*) AS numero_corsi FROM ...

e poi fai la fetch con

$tupla = mysql_fetch_assoc($ris);

allora $tupla['numero_corsi'] conterrà il valore restituito dalla query.

In generale con mysql_fetch_assoc valorizzi un array associativo in modo che le varie chiavi abbiano lo stesso nome degli attributi coinvolti nella query. Per approfondire gli array in PHP vedi qui.

___________

La funzione mysql_fetch_array restituisce un array di risultati in maniera diversa a seconda del secondo parametro passato che può valere:

  • MYSQL_NUM - restituisce un array con indici numerici. E' il comportamento di default di tale funzione.
  • MYSQL_ASSOC - restituisce un array asociativo (chiave => valore). In questo caso mysql_fetch_array e mysql_fetch_assoc sono equivalenti.
  • MYSQL_BOTH - restituisce un array i cui elementi sono accessibili sia attraverso un indice numerico sia attraverso una chiave. L'array quindi ha dimensioni doppie

_______

Con una query di tipo SELECT *FROM ... l'istruzione mysql_fetch_assoc restituisce un array associativo con le chiavi uguali ai nomi degli attributi coninvolti nella query

Con una query di tipo SELECT COUNT(*) FROM ... MySQL restituisce uno pseudo-attributo dal nome "COUNT(*)". La funzione mysql_fetch_assoc funzionerà come prima. Poiché è scomodo tale pseudo-attributo io di norma uso nella query degli alias in modo che il nome degli attributi restituiti risulti più semplice: SELECT COUNT(*) AS numero_righe FROM ...

 :bye:

risposto 11 anni fa
Gianni Tomasicchio
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda