ugrás a tartalomhoz

Firebird fájl feltöltés PHP vel blob -ba.

TTSZ · 2008. Júl. 23. (Sze), 16.45
Sziasztok!

Egy Firebird gurut keresek, aki tudna segíteni a következő kérdésben.

Adott egy firebird adatbázis.

PHP vel az egy űrlapon keresztül töltenék fel egy táblába adatokat. Az adatok között szerepel egy ADAT(blob) nevű rekord ahova a fájlt szeretném feltölteni.

Ilyesmi módszerrel próbálkoztam.:
include "connect.inc.php";

if (isset($_POST["bekuldve"]))
{

echo "Feltöltendő Fájl: ".$_FILES['file']['name'];
echo "<br />Fájl feltöltése....<br />";
$data = $_FILES['file']['name'];
  $blh = ibase_blob_create($dbh);
  ibase_blob_add($blh, $data);
  $blobid = ibase_blob_close($blh);
  $sql = "INSERT INTO WRKC(ADAT) VALUES (?)";
  $sth = ibase_query($dbh, $sql, $blobid);

}
else
{
echo "<form action=".$_SERVER["PHP_SELF"]." method=\"post\" name=\"hf\" enctype=\"multipart/form-data\" >
<input type=\"file\" size=\"20\" name=\"file\">
<input type=\"submit\" value=\"Feltöltés\" name=\"bekuldve\">
</form>";
}
Az adtbázisba nem csak a fájl menne egyedül. Raknék a többi rekordba pl leírást, azonosítót meg hasonló varchar illetve integer adatokat.

Ha már elolvasod azt is megköszönöm.

Üdv. Laci
 
1

Nem kell hozzá gurunak lenni...

N0r3i · 2008. Júl. 24. (Cs), 10.33
... hogy észrevedd, hogy a $data változódban nem a fájl nevét, hanem a tartalmát kellene átadnod (lásd http://hu.php.net/manual/en/function.ibase-blob-add.php).

Próbáld inkább így:
$data = file_get_contents($_FILES['file']['tmp_name']);
Norbi
2

olvasnivaló

virág · 2008. Júl. 24. (Cs), 10.37
Ezt is érdemes átolvasni: http://www.ibphoenix.com/main.nfs?a=ibphoenix&page=ibp_howto13
3

Idáig meg van

TTSZ · 2008. Júl. 24. (Cs), 17.00
Idáig meg van. Mégis akadályba ütközök.
pl hol a fájl? Hogyan töltöm be a blobba?

$blob_id = ibase_blob_create();
ibase_blob_add($blob_id,$HTTP_POST_VARS['ADDRESS']);
$blob_id_str = ibase_blob_close($blob_id);

$sth = ibase_prepare('INSERT INTO ADDRESS (KEYINDEX,NAME,ADDRESS,CATEGORY) VALUES (?,?,?,?)');
$trans=ibase_trans();
ibase_execute($sth,$HTTP_POST_VARS['KEYINDEX'],
  stripslashes(strip_tags($HTTP_POST_VARS['NAME'])),
  $blob_id_str,$HTTP_POST_VARS['CATEGORY']);
ibase_commit($trans);
ibase_free_query($sth);
ibase_close($dbh);
Itt a kód de itt miután kreálok egy blobot ibase_blob_create() -tal utána az add al addolom.
éz nem tisztszta. Az $_FILES tömbömbe vannak a fájlok. És azokat a ibase_blob_add rakja binárisba?
és utána INSERT -elem? Vagy hogy van ez. Help please. Valami egyszerű példát ha tudtok.

Köszi előre is.
4

Nos..

vbence · 2008. Júl. 24. (Cs), 17.17
Először is, ez a kód, amit ide írtál működik?

Ha igen: ibase_blob_add függvénnyel teszed a (bináris vagy bármilyen) tartalmat a blob objektumba. A $_FILES tömbben nem a feltöltött fájok vannak, hanem információ a feltöltött fájlokról (bővebben a php dukomentációban). Többek között benne van a tmp_name indexen tárolva a feltöltött fájl átmeneti neve a szerveren. Ha hozzá szeretnél férni egy fájl tartalmához, akkor van PHP függvény, ami elvégzi neked, ez nem más, mint a Norbi által említett file_get_contents (bővebben a dokumentációban).
5

OK

TTSZ · 2008. Júl. 24. (Cs), 18.58
Ok köszönöm az információt, tehát a megoldás a file_get_contents() .

tehát úgy fog kinézni a dolog, hogy a $crealt_blob = ibase_blob_create() létrehozok egy blobot. Aztán egy vátzóba a $data = file_get_contents() be belerakom a $_file[file][tmp_name] . Aztán az ibase_blob_add($crealt_blob,$data).

Ha jól értem ennek működnie kell!

Köszi szépen a választ.
6

Háááát.. mondjuk

vbence · 2008. Júl. 24. (Cs), 19.03
Először is Norbi írt egy működő megoldást. Azt az egy sort kell (-ett volna) kicserélni. Másodszor meg egyszerűen nem tudom értelmzni amit írsz, de úgy látom, akárhogyis, sikerült rálelni a megoldásra.
7

baj van!

TTSZ · 2008. Júl. 25. (P), 09.59
Most ki fogtok röhögni, de egyszerűen nem csinálja amit kellene. Valaki lenne olyan jó és küldene egy példát (ami működik) és kérem úgy rakja össze hogy az INSERT be ne csak fájlt töltse fel hanem a fájl nevét is mondjuk egy varchar mezőbe.
Csak azért hogy lássam, hogy hogy fog menni a betöltés ha több adatot kell INSERT elni egy táblába.

Valahol ott van baj, hogy a firebird nem akarja elfogadni a blobot

Hibauzenet:

ibase_prepare() [function.ibase-prepare]: Dynamic SQL Error SQL error code = -104 Token unknown - line 7, column 10

erre a kódra:

$dbh = (kapcsolat az adatbazishoz)
$buffer =  file_get_contents($_FILES["file_".$i]["tmp_name"]);
$blh = ibase_blob_create($dbh);
$adat = ibase_blob_add($blh, $buffer);
$blobid = ibase_blob_close($blh); 
$sth = ibase_prepare("INSERT INTO WRKC VALUES ($m_sif, ".($i+1).", '$ext[1]', '".$_FILES["file_".$i]["name"]."', '".$_FILES["file_".$i]["name"]."', '".$buffer."', 3, '', '0100-01-01')"); 
$trans=ibase_trans(IBASE_DEFAULT,$dbh);
De ez már legalább az 1000 edik variáció. Kérlek titeket aki már csinált ilyet küldje el hogyan csinálta mert a hajam tépem már az interbase től :(

Bocsi hogy ennyit sírok, de egyszerűen nem jön össze.

Köszi Laca
8

Rossz az inserted

zila · 2008. Júl. 25. (P), 10.10
Nem látom az isnertedben sehol a $blob_id-t, pedig anélkül nem fog menni...

Részlet a manualból:
<?php
  $dbh = ibase_connect($host, $user, $pass);

  $blh = ibase_blob_create($dbh);
  ibase_blob_add($blh, $data);
  $blobid = ibase_blob_close($blh);

  $sql = "INSERT INTO blobtable(blobfield) VALUES (?)";
  $sth = ibase_query($dbh, $sql, $blobid);
?>
9

Helyzet

TTSZ · 2008. Júl. 25. (P), 10.24
Na szóval most ez a helyzet.

$buffer =  file_get_contents($_FILES["file"]["tmp_name"]);
$blh = ibase_blob_create($dbh);  
ibase_blob_add($blh, $buffer);  
$blobid = ibase_blob_close($blh);  
$sql = "INSERT INTO WRKC(ADAT) VALUES ($m_sif, ".($i+1).", '$ext[1]', '".$_FILES["file_".$i]["name"]."', '".$_FILES["file"]["name"]."', '".$buffer."', 3, '', '0100-01-01')";  
$sth = ibase_query($dbh, $sql, $blobid); 
És hiba :
Warning: ibase_query() [function.ibase-query]: Dynamic SQL Error SQL error code = -104 Unexpected end of command - line 1, column 144
10

SQL Alapok

zila · 2008. Júl. 25. (P), 12.00
SQL INSERT:
INSERT INTO table_name (col1, col2, col3) VALUES (value1, value2, value2)
Ezzel azért illene tisztában lenni, ha adatbázist használó projekten dolgozol.
11

Nagyon zsír

TTSZ · 2008. Júl. 25. (P), 12.11
A jelenlegi progi mindaddig jó működik, míg a fájlt beke nem teszem. Tehát a blob konvertálással van valami baj.

$buffer =  file_get_contents($_FILES["file"]["tmp_name"]);	
$blh = ibase_blob_create($dbh);  
$proba = ibase_blob_add($blh, $buffer);  
$blobid = ibase_blob_close($blh);  
$sql = "INSERT INTO WRKC (WRKF_SIF, SORSZAM, WRKEXT_SIF, NEV, EREDETI_NEV, HELY, ADAT, MEGJEGYZES, D_DATETIME) VALUES ($m_sif, ".($i+1).", '".$ext[1]."', '".$_FILES["file"]["name"]."', '".$_FILES["file"]["name"]."', 3, '', '', '0100-01-01')";  

$sth = ibase_query($dbh, $sql, $blobid);
De mi?
ezt nem kellene átadni valaminek? ibase_blob_add($blh, $buffer);
12

Ne csináld már

zila · 2008. Júl. 25. (P), 16.24
Figyu, ez az utolsó postom, aztán lemodok rólad.
<?php  
  $dbh = ibase_connect($host, $user, $pass);  
  
  $blh = ibase_blob_create($dbh);  
  ibase_blob_add($blh, $data);  
  $blobid = ibase_blob_close($blh);  
  
  $sql = "INSERT INTO blobtable(blobfield) VALUES (?)";  
  $sth = ibase_query($dbh, $sql, $blobid);  
?> 


Ebből láthatod, hogy az ibase_blob_close() által visszaadott blob azonosítót (a példában ez a $blobid változóba kerül) kell
átadnod az adatbázisnak az insert utasításban. A fenti példában a blobtable táblában egy mező van aminek a neve blobfield, ezt a paramétert adod oda a query-nek, ami a ? helyére berakja, ha több oszlopod van akkor vagy a többi paramétert is bindolod (kérdőjelet írsz a helyükre és az értékeket az ibase_query()-ben adod meg, vagy ezt írod:
INSERT INTO WRKC (WRKF_SIF, SORSZAM, WRKEXT_SIF, NEV, EREDETI_NEV, HELY, ADAT, MEGJEGYZES, D_DATETIME) VALUES ($m_sif, ".($i+1).", '".$ext[1]."', '".$_FILES["file"]["name"]."', '".$_FILES["file"]["name"]."', 3, ?, '', '0100-01-01')
Ebben az esetben jó a $sth = ibase_query($dbh, $sql, $blobid) sor (a query-ben egy placeholder van a kérdőjel, ennek helyére kerül az ibase_query fv. harmadik paraméterében feltüntetett $blobid...

A te példádban az ADAT mezőnek egy üres stringet adsz át ('') ezek után miért csodálkozol, hogy nem működik?

Olvasgasd a php manualt, meg ismerkedj az sql-lel mert így hiába írunk neked példát nem fogod fel, és így fogalom nélkül copy-paste-elsz.
13

Köszi szépen

TTSZ · 2008. Júl. 26. (Szo), 20.42
Köszi szépen a segítséget, és ne haragudj, valószínűleg a fától nem láttam az erdőt. Azért nem adtam át semmit mert mutatni akrtam, hogy így INSERT eli. De szóval a ? jel azt jelenti, hogy oda megy a blob. Nem is tudom miért nem próbáltam beírni ( olyan furcsának tünt hogy ? jelet kell írni)

Azért nagyon köszi a segítséget.