[PHP] Problema con istruzione "use"

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao a tutti, apro questa discussione per chiedervi un aiuto in merito all'istruzione "use".
Mi spiego.
All'interno di un articolo Joomla ho inserito un piccolo codice per permettere ad un utente di esportare determinati dati in Excel.
Ho testato il codice fuori da Joomla e funziona perfettamente ma all'interno di Joomla mi genera questo errore:"syntax error, unexpected 'use' (T_USE)".
Secondo voi da cosa può dipendere?
Questo è quello che ho scritto.
PHP:
<?php
    require 'vendor/autoload.php';
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
    if (isset ($_POST['estrai_tutto']))
    {
.
.
.
.
}
?>
Ciao, grazie mille
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
Namespace joomla!
PHP:
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Macus_adi.
Scusa l'ignoranza, ma potresti darmi qualche informazione in più su come dovrei fare?
Ciao, grazie mille
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
Ho testato il codice fuori da Joomla e funziona perfettamente ma all'interno di Joomla mi genera questo errore:"syntax error, unexpected 'use' (T_USE)".
é un errore di sintassi
non dovrebbe funzionare ne fuori ne dentro Joomla
all'interno di Joomla stai usando un codice diverso da quello che hai postato ….

controlla che la riga che precede quella segnalata dall'errore, sia terminata con punto e virgola
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Marino51.
Il codice che ho postato è quello che ho inserito all'interno di Joomla (ho fatto copia/incolla) e la riga precedente l'errore termina con ";".
Francamente non riesco a capire perchè all'esterno di Joomla funziona perfettamente mentre al suo interno mi genera quell'errore.
Comunque riporto di seguito il codice completo.
PHP:
<form method="post">
<input type="submit" name="excel" value="clicca qui" />
</form>
<?php
    require 'vendor/autoload.php';

    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

    $spreadsheet = new Spreadsheet();
    $sheet = $spreadsheet->getActiveSheet();
       
    $con = mysqli_connect("localhost","root","","database");

    if (isset ($_POST['excel']))
    {
        // individuo solo le colonne che mi interessano
        $query_col = mysqli_query ($con, "SELECT tabella FROM tabella1 ORDER BY id");
        while ($info_col = mysqli_fetch_array ($query_col))
        {
            $nomi_colonne = $info_col[0];
            $array_col[] = $nomi_colonne; // array nomi colonne
        }
       
        // inserisco i nomi delle colonne nel file excel
        $num_colonne = count ($array_col); // numero colonne tabella
        $ascii = 65; // lettera A in formato ascii
        for ($j=0; $j<=$num_colonne - 1; $j++)
        {
            $cella = chr($ascii + $j) . 1;
            $sheet -> setCellValue($cella,$array_col[$j]);
        }
       
        // nomi colonne in stringa separati tra loro da una virgola
        $select_dati = implode(',',$array_col);
       
        // estraggo i dati dalla tabella del monitoraggio
        $query_dati = mysqli_query ($con, "SELECT $select_dati FROM tabella2 ORDER BY id");
       
        $row = 3;
       
        while ($dati = mysqli_fetch_object($query_dati))
        {
            for ($k=0; $k<=$num_colonne - 1; $k++)
            {
                $colonna = $array_col[$k];
                $sheet -> setCellValue(chr($ascii + $k).$row, $dati->$colonna);
            }
            $row++;
        }

        $styleArray =
        [
            'font' => ['bold' => true,],
        ];
       
        $text_bold1 = 'A1:';
        $text_bold2 = chr($ascii + $num_colonne) . 1;
        $text_bold_totale = $text_bold1 . $text_bold2;
        $spreadsheet->getActiveSheet()->getStyle($text_bold_totale)->applyFromArray($styleArray);

        $writer = new Xlsx($spreadsheet);
        $writer->save('excel.xlsx');
   
        echo "Esportazione avvenuta con successo";  
    }
?>
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
PHP:
<?php
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;

    require 'vendor/autoload.php';

    $spreadsheet = new Spreadsheet();
scrivi in questo modo e nel caso persista l'errore, posta l'intero errore ed indica la riga dove si é verificato
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
Appena provato con joomla ultima versione, copiando dalla doc ufficiale....
Nessun errore
PHP:
include_once 'vendor/autoload.php';
      
        use PhpOffice\PhpSpreadsheet\Spreadsheet;
        use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
      
        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
        $sheet->setCellValue('A1', 'Hello World !');
        $writer = new Xlsx($spreadsheet);
        $writer->save('hello world.xlsx');
NB: la sintassi tecnicamente corretta è questa:
PHP:
/***************BLOCK INCLUDE******************/
include_once '........';
require '.............';
require_once '................';
/******END BLOCK************/

/*************BLOCK USE*************************/

use Class\Generator\Class as Name;
/*****END BLOCK************/
Sicuro che vendor/autoload.php abbia i realpath corretti?
prova a fare composer update,
sostituisci il require con include_once
 
Ultima modifica:

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Macus_adi.
Ho fatto composer update e ho sostituito il require con include_once ma niente... :(
Scusa l'ignoranza ma potresti spiegarmi il discorso dei realpath?
Ciao, grazie mille.
P.S.: Allego una immagine con l'errore che mi genera
 

Allegati

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
Se vedi la config del file autoload.php è questa:
PHP:
require_once __DIR__ . '/composer/autoload_real.php';
return ComposerAutoloaderInit080b3b8961632bc4848cc3238fd9aab2::getLoader();
Autoload_real trova tutti i file per il corretto funzionamento della path vendor...
Il dubbio è questo...
Hai per caso copiato ed incollato la cartella vendor da installazione locale a remota?
Hai provato a cancellare la cartella vendor su joomla e installare direttamente da console?
Questo potrebbe essere anche un sintomo di mismatch path, ossia qualcosa non installata correttamente...
Il consiglio è questo:
Crea in locale un VHost con joomla e installa Spreadsheet, semplicemente copiando ed incollando il codice dalla doc ufficiale (5 minuti al massimo), e vedi se nella home trovi il file generato....
Se non da errore probabile che l'installazione composer (vendor/....) in remoto sia andata a farsi friggere, quindi cancella e reinstalla il tutto!
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Macus_adi, ho provato più di una volta a reinstallare composer ma niente, ho sempre quell'errore.
 

marino51

Utente Attivo
28 Feb 2013
2.609
132
63
Lombardia
non so se hai risolto,
in ogni caso ho letto da qualche parte che la posizione di "use" dipende dalla versione di PHP,
se apri un qualsiasi file di esempio, incluso nel pacchetto, vedi
PHP:
<?php
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Settings;

require __DIR__ . '/../Header.php';
ci sarà ben un motivo ….

quindi se tu provassi, mettendo "use" subito dopo il tag PHP,
PHP:
<?php
    use PhpOffice\PhpSpreadsheet\Spreadsheet;
    use PhpOffice\PhpSpreadsheet\Writer\Xlsx;
?>
<form method="post">
<input type="submit" name="excel" value="clicca qui" />
</form>
<?php
    if (isset ($_POST['excel']))
    {
        require 'vendor/autoload.php';

        $spreadsheet = new Spreadsheet();
        $sheet = $spreadsheet->getActiveSheet();
potresti togliermi il dubbio
grazie
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Marino51. Purtroppo non ho ancora risolto :(.
Per caso ricordi dove hai letto il discorso riguardante la posizione di "use"? (la versione di PHP è la 7.2.7)
Dove hai trovato i file di esempio?
Puoi, per favore, inserirmi i link in modo che posso guardare di persona? Te ne sarei molto grato.
Ciao, grazie mille.
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao a tutti.
Visto che non riesco a risolvere il problema ho deciso di scrivere uno script più semplice. Adesso riesco a estrapolare i dati in excel ma me li inserisce tutti dentro una sola cella.
Questo è lo script che ho scritto.
PHP:
<?php
    // recupero i dati dal file monitoraggio.php
    $tabella = $_SESSION['nome_monit'];
    $monitoraggio_elementi = $tabella . "_ok";

    $conn = new mysqli('localhost', 'root', ''); 
    mysqli_select_db($conn, 'meco'); 

    $query_col = mysqli_query ($conn, "SELECT tabella FROM $monitoraggio_elementi where tabella != '' ORDER BY id");
    while ($info_col = mysqli_fetch_array ($query_col))
    {
        $nomi_colonne = $info_col[0];
        $array_col[] = $nomi_colonne; // nomi colonne
    }
    
    $select_col = implode(',',$array_col); // elenco colonne in formato stringa

    $columnHeader = '';

    for ($i=0; $i<= count($array_col) - 1; $i++)
    {
        $columnHeader .= $array_col[$i] . "\t";
    }

    $setData = '';

    $setSql = "SELECT $select_col FROM $tabella ORDER BY id";
    $setRec = mysqli_query($conn, $setSql); 
 
    while ($rec = mysqli_fetch_row($setRec))
    {
        $rowData = ''; 
        foreach ($rec as $value)
        {
            $rowData .= $value . "\t";
        }

        $setData .= trim($rowData) . "\n"; 
    }
    
    header("Content-type: application/octet-stream"); 
    header("Content-Disposition: attachment; filename=User_Detail_Reoprt.xls"); 
    header("Pragma: no-cache"); 
    header("Expires: 0");
    
    echo ucwords($columnHeader) . "\n" . $setData . "\n";
?>
Secondo voi dove può essere il problema?
Ciao, grazie mille.
 

macus_adi

Utente Attivo
5 Dic 2017
1.038
59
48
IT/SW
(la versione di PHP è la 7.2.7
Dalla versione 5.3 in poi è tutto uguale...

Secondo voi dove può essere il problema?
Ricordati la discussione qui :https://forum.mrwebmaster.it/threads/php-come-esportare-due-tabelle-in-file-excel-su-due-fogli-distinti.53241/#post-207103
I dubbi sono certezze...
---------------------------------------------------------------------------------------------------------
ci sarà ben un motivo ….
I file citati sono dei TEST, non adatti alla PRODUZIONE ... Ci sta un mondo di differenza...

In produzione si include la vendor prima di ogni cosa, questo il motivo per il quale si fa prima "include/require" e poi "use" (cosa più logica)...
 

samurai.sette

Utente Attivo
17 Dic 2015
204
5
18
Ciao Macus_adi.
Giorni addietro mi hai scritto che hai provato phpspreadsheet su joomla (ultima versione) e ti funziona.
Mi sorgono due domande:
1) hai modificato qualche impostazione su joomla?
2) il codice che hai provato lo hai inserito in un articolo?
Se hai fatto come ho fatto io comincio a pensare che sia joomla (per chissà quale motivo) a impedirmi di utilizzare phpspreadsheet.
Ciao, grazie
 
Ultima modifica: