NOVINKA! E-learningové kurzy umělé inteligence. Nyní AI za nejlepší ceny. Zjisti více:
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

Diskuze: sql příkaz LOAD DATA LOCAL INLINE při použití PDO, DB Itnetwork knihovna neupdatne tabulku

V předchozím kvízu, Online test znalostí PHP, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Richard
Inzerent nabídek práce
Avatar
Richard:10.1.2017 17:32

Ahoj,

mám tabulku v SQL databázi, do které chci uploadnout CSV soubor se stejknou strukturou. Pracuji na windows localhostu (XAMPP). Pokud zadám SQL příkaz do phpMyAdmin

LOAD DATA LOCAL INFILE 'D:/10-xampp/htdocs/csvuploader/handling-fees.csv'
                                                INTO TABLE `dvtbl_getquotehc`
                                                FIELDS TERMINATED BY ','
                                                LINES TERMINATED BY '\n'
                                                IGNORE 1 LINES

tak to zafunguje a tabulka se načte.

Když použiji tohle v PHP, nic se nestane, chybu to nehodí a tabulka v SQL je stále prázdná

try {

                                Db::queryAll("LOAD DATA LOCAL INFILE '?'
                                                INTO TABLE `dvtbl_getquotehc`
                                                FIELDS TERMINATED BY ','
                                                LINES TERMINATED BY '\n'
                                                IGNORE 1 LINES
                                                ",array('D:/10-xampp/htdocs/csvuploader/handling-fees.csv'));
                                } catch (PDOException $ex)
                                {
                                        echo 'PDO ERROR: '.$ex->getMessage();
                                }

Napadá Vás kde může být zakopaný pes?

Je to součást kódu, který má uloadovat soubor a přímo jeho obsah uložit do SQL tabulky.

Odpovědět
10.1.2017 17:32
Udělej to teď - možná nebudeš mít už čas to udělat později
Avatar
Richard
Inzerent nabídek práce
Avatar
Richard:10.1.2017 20:24

První řešení.

Když použiji mysqli místo pdo tak to funguje. Tohle proběhne a nahraje data z csv do tabulky

$sql = "LOAD DATA LOCAL INFILE '".$changedrealpath."' REPLACE INTO TABLE dvtbl_getquotehc
                                        FIELDS TERMINATED BY ','
                                         LINES TERMINATED BY '\\r\\n'
                                         IGNORE 1 LINES";

                                //Try to execute query (not stmt) and catch mysqli error from engine and php error
                                if (!($stmt = $mysqli->query($sql))) {
                                        echo "\nQuery execute failed: ERRNO: (" . $mysqli->errno . ") " . $mysqli->error;
                                };

Takže první pomoc je nepoužívat PDO pro tento typ sql příkazu.

Nahoru Odpovědět
10.1.2017 20:24
Udělej to teď - možná nebudeš mít už čas to udělat později
Avatar
Odpovídá na Richard
Neaktivní uživatel:11.1.2017 0:56

Zkus sql dotaz napsat bez uvozovek kolem otazníku.

Nahoru Odpovědět
11.1.2017 0:56
Neaktivní uživatelský účet
Avatar
katrincsak
Člen
Avatar
Odpovídá na Richard
katrincsak:12.1.2017 15:34

Jak píše Petr Linhart, tak stačí jen dát pryč uvozovky kolem otazníku, není potřeba je tam dávat.

 
Nahoru Odpovědět
12.1.2017 15:34
Avatar
Richard
Inzerent nabídek práce
Avatar
Odpovídá na katrincsak
Richard:12.1.2017 19:51

Bez uvozovek to hlásí Syntax Error

Nahoru Odpovědět
12.1.2017 19:51
Udělej to teď - možná nebudeš mít už čas to udělat později
Avatar
Richard
Inzerent nabídek práce
Avatar
Richard:12.1.2017 19:55

Ale funguje PDO, když se nepoužije prepared statement, ale rovnou exec.
I co jsem googlil tak v prepared statements s tím měli i jiní problémy.
Funguje tohle:

$pdo->exec("LOAD DATA LOCAL INFILE '$fileName' REPLACE
                INTO TABLE `$hcTable`
                FIELDS TERMINATED BY ','
                LINES TERMINATED BY '\\r\\n'
                IGNORE 1 LINES
                ");
} catch (PDOException $ex)
{
        echo 'PDO ERROR: '.$ex->getMessage();
}

Takže pro LOAD DATA LOCAL INFILE nepoužívat prepared statements.

Nahoru Odpovědět
12.1.2017 19:55
Udělej to teď - možná nebudeš mít už čas to udělat později
Avatar
Odpovídá na Richard
Neaktivní uživatel:13.1.2017 22:19

A nejde prepared statement ani když nastavíš při inicializaci driveru PDO::MYSQL_AT­TR_LOCAL_INFI­LE na true?

Nahoru Odpovědět
13.1.2017 22:19
Neaktivní uživatelský účet
Avatar
Richard
Inzerent nabídek práce
Avatar
Odpovídá na Neaktivní uživatel
Richard:17.1.2017 20:46

Ahoj, PDO atribut jsem nastavil hned na začátku. To musí být při inicializaci PDO.

Nahoru Odpovědět
17.1.2017 20:46
Udělej to teď - možná nebudeš mít už čas to udělat později
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 8 zpráv z 8.