Autor Zpráva
gardener
Profil
Zdravím
Mám jeden dotaz, provádím import dat do DB pomocí LOAD DATA INFILE a absolutní cestu k souboru
zadávám pomocí
$soubor = dirname(__FILE__) . '\\' . $soubor_nazev;

Problé je ale v tom, že dirname(__FILE__) vrací řetezec se zpětným lomítky, což se nelíbí SQL, který chce cestu s lomítky klasickými...

Tuší někdo prosím, jak by se tento problém dal vyřešit?

Nebo musím použít strreplace?

Díky za každou radu.
AM_
Profil
str_replace je tak jednoduché řešení, že nevím, co jednoduššího bys chtěl.
gardener
Profil
To asi ano, ale nebude pak problém s WIN a LIN serverem?Tam je to přeci jinak..
sicario
Profil
Spravny oddelovac cesty byva ulozen v preddefinovane konstante DIRECTORY_SEPARATOR. Zatim jsem na Win nemel problem s pouzivanim / oddelovace.
gardener
Profil
Ja take ne, ale vem si, že pokud použiji strreplace, na \ tak dostanu /, to bude fajn na localu, ale problem nastane na hostingu, takze jedine reseni by bylo rozlisit IP a podle toho bud includovat konstantu /, nebo nikoliv.
AM_
Profil
kdyz pouzijes str_replace \ na / na retezec, ktery bude uz mit spravne /, tak se prece nic nestane, sice tam ten str_replace na hostingu pojede naprazdno, ale fungovat to bude na obojim.
gardener
Profil
o.k vykousim..
Majkl578
Profil
roblé je ale v tom, že dirname(__FILE__) vrací řetezec se zpětným lomítky, což se nelíbí SQL, který chce cestu s lomítky klasickými...
neumite snad escapovat?
nightfish
Profil
Majkl578
neumite snad escapovat?
escapováním se změní zpětná lomítka na dopředná?
Majkl578
Profil
nightfish
přečti si prosím znovu první příspěvek. on se neptá, jak změnit lomítka, ale jak vyřešit problém kdy sql nebere neescapovaná \.
gardener
Profil
To umim, ale tam pak vznika problem s temi zpetnymi lomitky
viz:
$soubor = dirname(__FILE__) . '\\' . $soubor_nazev;

A pokud dám escapovat dostanu v tomhle případě hlášku typu:
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'ODBC'@'localhost' (using password: NO) in C:\xampp\htdocs\Registrace\admin\nahraj_seznam.php on line 2

Takže nevím co s tím, zatím jsem vždy prováděl ten import přímo v PHPMyAdmin ale teď to musím vyřešit jinak.
Jinak script vypadá takto:
Myslím, že by to mělo být v pořádku ne?

<?
  $soubor_nazev =(mysql_real_escape_string($_FILES['data']['name']));
  if ($_REQUEST["odeslano"]==1):

  if (!is_file($_FILES['data']['tmp_name'])) die ("Nenahráli jste žádný soubor");
  if ($_FILES['data']['size']>1000) die ("Soubor je příliš velký");
  //echo($cesta);
  $nazev=explode(".", basename($soubor_nazev));
  if ($nazev[1]!= "csv")die("Je mozne nahravat pouze soubory s priponou csv");//Vraci priponu souboru
 // if (is_uploaded_file($_FILES['data']['tmp_name']))
  if (move_uploaded_file($_FILES['data']['tmp_name'],$soubor_nazev))
  {
    include_once ("../db_connect.php");
    //$soubor=$_SERVER["SCRIPT_FILENAME"]."/".$soubor_nazev;
    $soubor = dirname(__FILE__) . '\\' . $soubor_nazev;
    echo($soubor);
    //substr()
    $vlozeni = mysql_unbuffered_query ("LOAD DATA INFILE '".$soubor."' INTO TABLE products
	FIELDS TERMINATED BY ','
    LINES TERMINATED BY '\r\n'
    IGNORE 1 LINES;"); 
	if (!$vlozeni) 
	{
		die("Vlozeni se nepodarilo");
	}  
  };


else:
?>
Majkl578
Profil
no jóóó, když ona nejde funkce mysql_real_escape_string() že? jak by taky mohla před připojením k databázi.
takže:
mysql_connect(...);
mysql_select_db(...);
$cesta = mysql_real_escape_string(dirname(__FILE__) . '\\' . $soubor_nazev); 

nebo:
$cesta = str_replace('\', '\\', dirname(__FILE__)) . '\\\\' . $soubor_nazev;
gardener
Profil
Pravda, díky za radu, příště si na to dám pozor..
AM_
Profil
$cesta = str_replace('\', '\\', dirname(__FILE__)) . '\\\\' . $soubor_nazev;
to už je trochu předimenzované, to raději použij funkci
addslashes($cesta)

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: