Visualizzazione risultati 1 fino 7 di 7

Discussione: Problema con funzione copy() e permessi di scrittura

  1. #1
    Guest

    Predefinito Problema con funzione copy() e permessi di scrittura

    Ciao a tutti,
    Sono un nuovo utente alle prese con il mio sito...
    Volevo assistenza riguardo uno script php.
    In pratica devo copiare il contenuto di un file in xml posizionato allo stesso livello della index.php in un altro file.xml che si trova in una directory.. le cartelle e i file hanno i permessi di scrittura impostati con chmod 0755, ma il contenuto non viene copiato..

    Posto il codice della funzione
    Codice PHP:
    function save_stream_alert_return($src,$dest,$return,$good,$bad)
    {
    chmod($src, 0755);
    chmod($dest, 0755);
    $f = fopen($src, 'r');
    $content = file_get_contents($src);
    $close_src=fclose($f);
    if (
    $close_src===true)
    {
    //se l'operazione del primo file si conclude
    //positivamente, scrivo il contenuto nell'altro file
    $o = fopen($dest, 'w');
    file_put_contents($dest, $content);
    $close_dest=fclose($o);
    if (
    $close_dest===true)
    {
    //redirect
    redirect_uri($return.$good);
    }
    else
    {
    //redirect
    redirect_uri($return.$bad);
    }
    }
    else
    {
    //redirect
    redirect_uri($return.$bad);
    }
    }
    P.S, ho provato diverse funzioni prima di questa, ad esempio ho usato copy() ma il risultato è lo stesso, cioè che non copia un bel niente.
    E' un problema di permessi di scrittura?
    Grazie in anticipo

  2. #2
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Togli le chiamate a fopen e fclose.

  3. #3
    Guest

    Predefinito

    Grazie per l'aiuto,
    ho provato a rimuovere fopen e fclose, ma non funziona perchè mi dà i permessi di scrittura a 0664 nel file "$dest" ed'è strano perchè nella funzione ho scritto chmod a 0755.... :-(, così ho provato le funzioni per vedere che tipo di permessi ha:
    Codice PHP:
    echo'src=';
    var_dump(is_executable($src));
    var_dump(is_readable($src));
    var_dump(is_writeable($src));
    echo
    'dest=';
    var_dump(is_executable($dest));
    var_dump(is_readable($dest));
    var_dump(is_writeable($dest));
    ho scoperto che i file non hanno permessi per essere eseguibili, continuo a non capire perchè chmod è 0755 !!
    forse son duro io, ma ho cambiato i permessi con ftp e ancora niente, continua a non copiare il file...

    centra qualche compatibilià con l'host linux e la funzione chmod??

    Grazie davvero se riuscite ad aiutarmi :-)

  4. #4
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    Non toccare i permessi, vanno già bene quelli predefiniti. Come hai modificato il codice esattamente? La cartella di destinazione esiste? Cosa restituisce la chiamata alla funzione file_put_contents?

  5. #5
    Guest

    Predefinito

    Si la cartella di destinazione esiste e viene creata insieme ad altri file e cartelle quando si installa il sito la prima volta. Ho utizzato
    mkdir('config_xml', 0755); solo per questa cartella.

    In generale al suo interno ci sono file xml che contengono alcuni dati e impostazioni, infatti in fase di lettura saranno mostrati a video nella pagina "admin" e l'utente ha la possibilità di modificarli.
    1) Dopo aver salvato le modifiche si crea un file.xml temporaneo allo stesso livello della index.php e non nella cartella "config_xml".
    2) Il file.xml temporaneo deve aggiornare l'altro xml, quella nella cartella config_xml, utilizzando file_put_contents();

    si tratta quindi di copiare un file in quella cartella..

    questo è il codice che crea il file temporaneo in xml:
    Codice PHP:
    $nav_first = filter_message($_POST['nav_first']);
    $seo_title = post_slug($_POST['seo_title']);
    $seo_description = filter_message($_POST['seo_description']);
    $comment = $_POST['comment'];
    $nav_lang = $_POST['nav_lang'];
    if(isset(
    $_POST['idnavbar']))
    {
    $idnavbar = $_POST['idnavbar'];
    }

    if(!isset(
    $_POST['idnavbar']))
    {
    //ADD-CLASS-XML-ITERATOR
    include_once($path_default_dir.'admin/xmlreader-iterators.php');
    $xmlInputFile = $db_nav_xml;
    $xmlOutputFile = $inputiterator_nav;
    $reader = new XMLReader();
    $reader->open($xmlInputFile);
    $writer = new XMLWriter();
    $writer->openUri($xmlOutputFile);
    $iterator = new XMLWritingIteration($writer, $reader);
    $writer->startDocument();
    foreach (
    $iterator as $node)
    {
    $isElement = $node->nodeType === XMLReader::ELEMENT;
    if (
    $reader->nodeType == XMLReader::END_ELEMENT && $reader->name == 'navcontent')
    {
    if(
    $reader->getAttribute('lang')==$nav_lang)
    {
    $rand=rand(0,999999);
    $writer->startElement('navbar');
    $writer->writeAttribute('nav', $rand.'nav');
    $writer->startElement('firstchild');
    $writer->writeAttribute('firstItem', $rand.'list');
    $writer->writeElement('navfirstchild', $nav_first);
    $writer->startElement('metatag');
    $writer->writeElement('title', $seo_title);
    $writer->writeElement('description', $seo_description);
    $writer->writeElement('author', $site);
    $writer->startElement('hreflang');
    $writer->writeElement('alternate', $nav_lang);
    $writer->endElement();
    $writer->endElement();
    $writer->startElement('contentpage');
    $writer->writeCData($comment);
    $writer->endElement();
    $writer->endElement();
    $writer->startElement('listchild');
    $writer->writeAttribute('group', $rand.'child');
    $writer->writeElement('empty', '');
    $writer->endElement();
    $writer->endElement();
    }
    }
    //end-writer
    $iterator->write();
    }
    //end-iteration
    $writer->endDocument();
    $reader->close();
    unset(
    $reader);
    unset(
    $writer);
    //save
    save_stream_alert_return($xmlOutputFile,$db_nav_xml,'admin.php?target=editmenu&navlang='.$nav_lang.'&',$success,$erroraction);

    //$xmlOutputFile (contiene il nome del file temporaneo)
    //$db_nav_xml (percorso e nome del file da aggiornare)
    questo è il codice che copia il file temporaneo aggiornando il file nella cartella "config_xml"
    Codice PHP:
    function save_stream_alert_return($src,$dest,$return,$good,$bad)
    {
    chmod($src, 0755);
    chmod($dest, 0755);
    $content = file_get_contents($src);
    file_put_contents($dest, $content);
    }
    Non posso evitare di creare un file temporaneo perchè xmlwriter non accetta come percorso un file all'interno di una cartella nella funzione openUri(), è un suo bug riportato anche in php.net

    Ho dovuto usare la classe xmlreader+xmlwriter per parsare e sovrascrivi file xml che saranno di grandi dimensioni dai 50 mb circa in su.

    Come posso copiare il file?
    Ultima modifica di designrevolution : 10-03-2015 alle ore 01.02.03

  6. #6
    karl94 non è connesso Staff AV
    Data registrazione
    03-10-2005
    Messaggi
    17,745

    Predefinito

    In realtà a me funziona il metodo openURI:
    Codice PHP:
    <?php

    $oXMLWriter
    = new XMLWriter;
    $oXMLWriter->openURI('../adoc.xml');// Ho provato anche 'out/adoc.xml', funziona comunque
    $oXMLWriter->startDocument('1.0', 'UTF-8');

    $oXMLWriter->startElement('test');
    $oXMLWriter->text('Hello, World!');
    $oXMLWriter->endElement();

    $oXMLWriter->endDocument();
    ?>
    Ultima modifica di karl94 : 10-03-2015 alle ore 01.30.29

  7. #7
    Guest

    Predefinito

    E'vero funziona!!! Quando ho visto su php.net che xmlwriter non scrive percorsi di questo tipo "cartella/file.xml" non ho provato a verificare se tale informazione fosse giusta o meno.
    Bene, adesso posso anche evitare di creare una copia temporanea. Grazie per l'aiuto

Regole di scrittura

  • Non puoi creare nuove discussioni
  • Non puoi rispondere ai messaggi
  • Non puoi inserire allegati.
  • Non puoi modificare i tuoi messaggi
  •