[PHP] Problema con istruzione "use"

samurai.sette

Utente Attivo
17 Dic 2015
235
6
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
 
Namespace joomla!
PHP:
use \PhpOffice\PhpSpreadsheet\Spreadsheet;
use \PhpOffice\PhpSpreadsheet\Writer\Xlsx;
 
Ciao Macus_adi.
Scusa l'ignoranza, ma potresti darmi qualche informazione in più su come dovrei fare?
Ciao, grazie mille
 
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
 
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";  
    }
?>
 
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
 
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:
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

  • Errore.JPG
    Errore.JPG
    42,9 KB · Visite: 507
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!
 
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
 
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.
 
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.
 
(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.mrw.it/threads/php-co...xcel-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)...
 
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:

Discussioni simili