CHAT PHP - MYSQL

di il
7 risposte

CHAT PHP - MYSQL

Ciao a tutti,
sto provando a studiare un pò di PHP e per esercitazione sto realizzando una di CHAT con DB MYSQL.

La mia chat è composta da 4 pagine
chat.php
message.php
write.php

chat.php

<div class="read_chat" id="read_chat">
	<?php include 'message.php' ?>
</div>

<div class="write_chat">
	<?php include 'write.php' ?>
</div>
leggi.php

include("./include/MethodChat.php");
// qui ho semplicemente richiamato un metodo di "MethodChat" che recupera i record sul db e con un for li stampa
write.php

<input type="text" class="form-control" id="text" name="text" >
<button type="button" class="btn btn-secondary" onclick="send();">Invia</button>
Al click sul bottone, viene invocata la funzione javascript "send" che fa una chiamata AJAX ad un'altra pagina php (che consente l'inserimento sul DATABASE" del testo inserito

funzione js

function inviaMessaggio(){
var text = $( "#text" ).val();
$.ajax({ url: 'chat/sendMessage.php',
         data: {text: text},
         type: 'POST',
    success: function (data) {
		$( "#read_chat" ).html(data);
        },
        error: function (xhr, status) {
            alert("Sorry, there was a problem!");
        }
});

}
sendMessage.php

In questa pagina.php, inserisco il testo nel db e poi faccio un location che lo manda nuovamente a message.php
Tuttavia, quando eseguo header( "Location: message.php") , ottengo questo errore:
Warning: include(./include/MethodChat.php): failed to open stream: No such file or directory in E:\xampp\htdocs\chat.

Praticamente, la prima volta recupera bene i messaggi dal db e li stampa, poi al ckick del bottone (quando fa la chiamata AJAX) e cerca di aggiornare il db read_chat passando il message.php mi da l'errore.

Qualcuno sa come posso risolvere questo problema?

Grazie a tutti

7 Risposte

  • Re: CHAT PHP - MYSQL

    È un problema di percorso.
    È buona norma stilare il proprio codice con un ritorno a capo alla fine del file o in certi contesti per la parentesi graffa di chiusura.
    Focalizza mentalmente il tuo progetto, sicuramente con 5 percorsi potrai presto.
    il singolo punto equivale a dire cartella corrente mentre il doppio punto equivale a dire cartella padre, ho scritto un breve codice di illustrazione spero ti sia di aiuto.
    Ovviamente settings.php, load.php , /cartella/a.php dovrebbe essere caricato una sola volta ma per i programmatori esterni è difficile tale vincolo.

    /cartella/a.php
    <?php
    $path = rtrim(dirname(dirname(__FILE__)), '\\/');
    $path2 = $path;
    $file = str_replace('/', DIRECTORY_SEPARATOR, '/load.php');
    $file2 = $file;
    require_once $path.$file;
    $path = $path2;
    $file = $file2;
    $root = root_absolute($path);
    unset($path, $file, $path2, $file2);
    $_SERVER['DOCUMENT_ROOT'] = $root;
    $_ENV['DOCUMENT_ROOT'] = $root;
    
    $a = remove_dir(__FILE__).DIRECTORY_SEPARATOR;
    $i = 1;
    $a = rtrim(recursive_full_path($a, $i), '\\/').DIRECTORY_SEPARATOR; // ho dirname $a per la seconda volta
    $display = rtrim(APPPATH, '\\/') ? rtrim(APPATH, '\\/') : DIRECTORY_SEPARATOR;
    echo 'la tua web root è '.$root."\n";
    echo 'la tua app root è '.$display."\n";
    echo '1 esempio con remove_dir(__FILE__) e recursive_full_path(__FILE__) '.$a."\n";
    // fine primo esempio
    
    //scorro due volte
    $i = 2;
    $a = rtrim(recursive_full_path(__FILE__, $i), '\\/').DIRECTORY_SEPARATOR;
    echo '2 esempio scorro due volte con recursive_full_path(__FILE__) '.$a."\n";
    unset($a, $i, $display); //cancello le variabili globali
    //fine secondo esempio
    
    
    /settings.php
    <?php
    function root_absolute($path) {
    	$path2 = str_replace(DIRECTORY_SEPARATOR, '/', "$path");
    	$root = $_SERVER['REQUEST_URI'] ? $path2 : '/';
    	$a = dirname($_SERVER['REQUEST_URI']);
    		if($a != $path2 && strpos(strrev($path2), strrev($a) === 0)) {
    		 $root = substr($path2, 0, strlen($path2)-strlen($a));
    		}
    	$root = str_replace('/', DIRECTORY_SEPARATOR, "$root");
    return $root;
    }
    function recursive_full_path($a, $i=1) {
    $a = dirname($a).DIRECTORY_SEPARATOR;
    	if(((--$i) > 0)) {
    		return recursive_full_path($a, $i);
    	}
    return $a;
    }
    function remove_dir($a) {
    $a = rtrim(full_path($a), '\\/');
    return $a;
    }
    // questa funzione è per uso interno invece leggi remove_dir($a) o meglio recursive_full_path($a, $i)
    function full_path($a) {
    $a = dirname($a);
    return $a;
    }
    
    
    /load.php
    <?php
    $path = rtrim(dirname(__FILE__), '\\/');
    $file = str_replace('/', DIRECTORY_SEPARATOR, '/settings.php');
    require_once $path.$file;
    if( ! defined( 'APPPATH' ) ) {
    define( 'APPPATH', "$path" . DIRECTORY_SEPARATOR );
    }
    unset($path, $file);
    
    
    dirname può restituire / se è solamente questo carattere, dicasi root (in realtà la root può essere altrove ma il doc afferma questo).
    Il terzo e il quarto esempio dopo aver incluso load.php che inserisce anche settings.php , load.php crea la costante root app APPPATH e successivamente la variabile per la web root mentre il quinto è include dirname(__FILE__).'/percorso_file.php';.
    Se crei il codice conosci già a priori se il progetto di tale file risiede in una cartella o sono al livello prima o dopo.. quindi tutti e 5 gli esempi sono complementari.
  • Re: CHAT PHP - MYSQL

    Ciao Hormus,
    grazie mille per la risposta.
    Il message.php si trova nella stessa directory di sendMessage.php , però effettivamente ho notato che il path cambia in base a dove chiamo le pagine.php.

    Pensavo che l'include funzionasse come un import di un package che si fa con JAVA o JAVASCRIPT.

    Ho notato che mettendo nell'include il PATH costruito con $_SERVER['DOCUMENT_ROOT'] /mioprogetto/etc... funziona bene, potrebbe essere una buona soluzione oppure il $_SERVER['DOCUMENT_ROOT'] è meglio non utilizzarlo?

    Non ci sta un modo per dare un path assoluto che funzioni da qualsiasi posto venga chiamata la pagina.php?

    Grazie mille
  • Re: CHAT PHP - MYSQL

    Ciao buona domenica ho creato un codice spero sia di aiuto, dovrebbe funzionare e soprattutto sarà universalmente.
  • Re: CHAT PHP - MYSQL

    Hormus ha scritto:


    Ciao buona domenica ho creato un codice spero sia di aiuto, dovrebbe funzionare e soprattutto sarà universalmente.
    Hmmm che codice?Hai allegato qualcosa?Perchè io non vedo nulla
  • Re: CHAT PHP - MYSQL

    Https://www.iprogrammatori.it/forum-programmazione/post8656758.html#p8656758
  • Re: CHAT PHP - MYSQL

    Hormus ha scritto:


    Https://www.iprogrammatori.it/forum-programmazione/post8656758.html#p8656758
    Ah grazie mille ora studio per bene il codice che hai scritto
  • Re: CHAT PHP - MYSQL

    Prego se hai dubbi scrivi pure.
    Ho persino chiamato il percorso con cartella non dovrebbero esserci problemi di gerarchia file.. ovviamente chiamo dirname(__FILE__) che restituisce la directory corrente se racchiuso da un secondo dirname mi riferisco alla cartella precedente padre la costante magica __FILE__ recupera l'intero percorso con il nome del file..
    Mentre rtrim che toglie l'ipotetica root finale \/ occorre per non essere ambigui sui percorsi poiché se php è configurato può anche accedere al livello prima della web root.
    Le uniche due funzioni degne di nota sono la root e il ricorsivo le altre occorrevano come ragionamento.
    Uhm non ho testato la root con mod_rewrite e nel caso di redirect o fuori della web root comunque oltre queste due ipotesi dovrebbe funzionare.
    Comunque quando verrà utilizzato da un programmatore esterno è buona norma sanificare i percorsi e nonché \/ finale in modo da evitare un doppio carattere.
Devi accedere o registrarti per scrivere nel forum
7 risposte