Autor Zpráva
jaku6@mac.com
Profil *
Mám data z formuláře vytvořeného na cognitoforms.com, kde umožňují přeposílat data pomocí JSON POST do databáze. Na jejich stránkách ukazují následující vzorový PHP script, který ale neposílá do mojí MySQL databáze nic. MySQL databáze i tabulka je vytvořená a všechny položky jsou typu TEXT bez omezení, bez primárního klíče a čehokoli. zkoušel jsem všechno možné, ale vůbec nic se neděje a nechápu proč. Může mi někdo pomoct?

<?php  
    $json = file_get_contents("php://input");  
    if (emptyempty($json)) {  
        echo "No data payload";  
        die;  
    }
    $contact = json_decode($json);  
    if ($contact == null && json_last_error() !== JSON_ERROR_NONE) {  
        echo "Error reading JSON: " . json_last_error();  
    }
    $mysqli = new mysqli("localhost", "phptest", "vc3123!!", "phptest");  
    if ($mysqli->connect_errno) {  
        echo "Failed to connect to MySQL: (" . $mysqli->connect_errno . ") " . $mysqli->connect_error;  
        die;  
    }
    $query = "insert into contacts (firstname,lastname,address_line1,address_line2,address_city,address_state,address_postalcode,phone,email,company,comments) values (?,?,?,?,?,?,?,?,?,?,?)";  
    if (!($stmt = $mysqli->prepare($query))) {  
        echo "Prepare failed: (" . $stmt->errno . ") " . $stmt->error;  
        die;  
    }
    if (!($stmt->bind_param("sssssssssss",   
        $contact->{'Name'}->{'First'},   
        $contact->{'Name'}->{'Last'},  
        $contact->{'Address'}->{'Line1'},  
        $contact->{'Address'}->{'Line2'},   
        $contact->{'Address'}->{'City'},  
        $contact->{'Address'}->{'State'},  
        $contact->{'Address'}->{'PostalCode'},  
        $contact->{'Phone'},  
        $contact->{'Email'},  
        $contact->{'Company'},  
        $contact->{'CommentsOrQuestions'})))
   {          
        echo "Bind failed: (" . $stmt->errno . ") " . $stmt->error;  
    }      
    if (!($stmt->execute())) {  
        echo "Execute failed: (" . $stmt->errno . ") " . $stmt->error;      
    }  
?>  
Keeehi
Profil
Funkce emptyempty neexistuje.
Víš, kde to failuje, nebo to proběhne až do konce bez jediného zaváhání?
jaku6@mac.com
Profil *
Keeehi:
jasně "emptyempty" je chyba při kopírování má tam samozřejmě být pouze
 if (empty($json))
tenhle script běží na pozadí, takže nevím jak to přesně proběhne, ale chybu to nevyhodí ani do logu na serveru.
Ale přitom do databáze to nezapíše nic. Uvádějí tam stránku pro testování http://requestb.in a ta data z formuláře přijme a vypíše, i když nevím jestli to zpracovávají PHP, Javou nebo Java Scriptem. Mě ale nejvíc vyhovuje PHP, protože neklade na uživatele žádné nároky na nastavení prohlížeče.
Davex
Profil
Ty chyby nevypisuj přes echo, ale ukládej je do souboru, kam se potom podívej co to hlásí za chybu.
Keeehi
Profil
jaku6@mac.com:
Sice to normálně na pozadí probíhá, ale ve vývojářských nástojích jednotlivých prohlížečů si tipicky tyto požadavky můžeš nechat zobrazit.
jaku6@mac.com
Profil *
Tak jsem ten začátek scriptu opravil
<?php
$json = file_get_contents("php://input");
$fp = FOpen("./chyby.log","a");

if (empty($json)) {
FPutS($fp, "No data payload");
die;
}
FPutS($fp, "json neprázdný\n");

$contact = json_decode($json);
FPutS($fp, "hodnoty");
FPutS($fp, $contact);

a vypíše to "json neprázdný" a dál nic.
Keeehi
Profil
Pro začátek dobrý. Je zajímavé, že se v souboru neobjeví i "hodnoty". To by pak znamenalo, že to selhalo nejspíše na řádku 11. Ovšem když dekódování jsonu selže, mělo by se vrátit null a ne rovnou selhat celý script. Doporučil bych tedy si vypsat, cojev proměnné $json a v nějakém testovacím scriptu vedle to prohnat json_decode a zjistit, zda to způsobuje nějaké chyby.
Davex
Profil
1) Nepoužíváš nějakou prehistorickou verzi PHP? Ukazuje se ve výpisu phpinfo() rozšíření json?
2) Data asi neumí json_decode() zpracovat. Zapiš si obsah proměnné $json do souboru a podívej se, zda obsahuje očekávaná data.
3) Zapisuj si chyby PHP do souboru a zkontroluj, zda se tam nějaká neobjeví.
<?php
error_reporting(E_ALL);
ini_set("log_errors", 1);
ini_set("error_log", __DIR__ . "/php_errors.log");
(případně adekvátně v konfiguraci PHP)
jaku6@mac.com
Profil *
PHP mám 5.3.5, json version 1.2.1, json support enabled.
ANO - proměnná $json obsahuje všechna očekávaná data formuláře, takže chyba bude ve funkci json_decode()
zatím díky všem, vrhnu se na to zase zítra
Jan Tvrdík
Profil
Viz také json_last_error.
jaku6@mac.com
Profil *
OK tak už mi to jede (byla tam chyba při connectu databáze), ale mám ještě problém s češtinou - použil jsem:
$raw_json = file_get_contents("php://input");
$json = mysql_real_escape_string($raw_json);
 

ale to mi $json "vyčistí" tak, že je prázdná.
Keeehi
Profil
jaku6@mac.com:
mysql_real_escape_string použij až těsně před sestavováním dotazu do databáze.

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: