2016-03-21 18 views
1

Bir BLOB formatında bir tabloda saklanan çıktı şifreli verilere çalışıyorum ama işe yaramıyor. Hazırlanan ifadeleri kullanarak ekledim ve mysql komut satırı istemcisini işaretlediğimde, girdinin kaydedildiğini gösterdi, ancak blob alanları boş ve diğer her alanın bir değeri vardır. Ayrıca, tablo oluşturma sırasında belirttiğim gibi blob alanı boş olmamalıdır, bu yüzden komut satırının blob alanı verilerini gösteremeyeceğini düşündüm.Mysql'den php'ye blob verileri (resim değil) nasıl çıktı?

Yani php kullanarak, blob alanının base64_encode değerini döndürmeyi denedim, ancak yardımcı olmadı. Hala boş. Ben ne yaparım?

P.S. .: O AES-256 ile metin şifreli bir görüntü değil.

$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)"); 
if($stmt->bind_param("sbb", $eid, $ekey, $ecipher)) { 
echo "Successful"; 

} 

// set parameters and execute 
$eid=$postedID; 
$ekey=$postedKey; 
$ecipher=$postedCipher; 

$stmt->execute(); 
$stmt->close(); 
$conn->close(); 

Bundan sonra bunu kodlayan BLOB değeri döndürmek için çalıştı, ama bir dize ortaya çıkıyor olan id değeri ise hiçbir şey döndürür. Bunu nasıl çözebilirim? Verileri şifrelemem ve daha sonra web sitesi için şifresini çözmem gerekiyor.

Bunu nasıl sağlıyorsunuz? Çok teşekkürler.

P.S. .: Bu kadar çok yararlı biri olmayacak ilk şifresini çözmek için öne henüz şifresini ilk şifrelenmiş değeri gerek denemedim.

tablo I string parametreleri değişti sorun çözüldü bu-

+-------------+---------------------+------+-----+---------+----------------+ 
| Field  | Type    | Null | Key | Default | Extra   | 
+-------------+---------------------+------+-----+---------+----------------+ 
| eid   | varchar(255)  | NO | PRI | NULL |    | 
| ekey  | blob    | NO |  | NULL |    | 
| ecipher  | blob    | NO |  | NULL |    | 
+-------------+---------------------+------+-----+---------+----------------+ 
+0

bu tablo için şema nedir gibi

deneyin şey? 'CREATE TABLE CREABLE 'ayrıntıları verecek. Bu sütuna ne kadar veri kaydetmeye çalışıyorsunuz? – tadman

+0

Yukarıda bir tablo açıklaması verdim. –

+0

"BLOB" un yalnızca 65 KB veri tuttuğunu unutmayın. Daha fazlasına ihtiyacınız varsa, bir "LONGBLOB" gerekir. – tadman

cevap

3

benziyor "s", bu ipleri verilerini düzenlenen içine edildi değişkenler beri düzgün çalışması gibi görünüyor, bu yüzden . sığar

Yani düzeltilmiş kodudur:

$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)"); 
if($stmt->bind_param("sss", $eid, $ekey, $ecipher)) { 
echo "Successful"; 

Bu mükemmel bir çözümdür demiyorum, ama şimdi benim sorunu çözmek gibi görünüyor, Birisi php yerine string içinde blob kullanmanın bir yolunu sunar eğer ben son derece yardımcı olacaktır. Teşekkür ederim. b Belirleme

+0

Garip. Doktorlar b'nin blob için çalışması gerektiğini söylüyor. http://php.net/manual/en/mysqli-stmt.bind-param.php – Phil

+0

Tam olarak, bu yüzden ilk sırada 'b' yerleştirdim ve kayıt boş görünüyordu. Dize şimdi iyi çalışıyor gibi görünüyor, ama bence lekeler için 'b' olduğu için, bunun için iyi bir neden olması gerektiğini düşünüyorum, bunu nasıl yapacağımı bilmek isterim. @ Phil_1984_ –

0

sunucuya ayrı paketler halinde veri göndermek için mysqli söyler.

Documentation here

Ancak, ne dokümantasyon detaylara başarısız paket verileri belirtmelidir nasıl. Birisi, diğer türler gibi, veriyi içeren başvurulan bir değişkeni ayarlamanız gerektiğini varsayar. send_long_data

'u kullanmanız gerektiği ortaya çıkıyor. Bu işlev sayesinde, her bir veri yığını üzerinde denetiminiz vardır, bu nedenle sunucunuzun işlem yapması için çok büyük bir paket göndermediğinizden emin olmanız size kalmış. Bu

$stmt = $conn->prepare("INSERT INTO data_store (eid, ekey, ecipher) VALUES (?, ?, ?)"); 

//Initialise variables 
$eid = $postedID; 
$ekey = NULL; 
$ecipher = NULL; 

if($stmt->bind_param("sbb", $eid, $ekey, $ecipher)) { 

    // Send blobs 
    $ekey_chunks = str_split($postedKey, 8192); 
    foreach ($ekey_chunks as $chunk) { 
     $stmt->send_long_data(1, $chunk); 
    } 

    $ecipher_chunks = str_split($postedCipher, 8192); 
    foreach ($ecipher_chunks as $chunk) { 
     $stmt->send_long_data(2, $chunk); 
    } 

    $stmt->execute(); 
    $stmt->close(); 
} 

$conn->close(); 

Kaynak this blog

+0

Paket büyüklüğünde sorun yaşıyorum, gereksinimlerime göre tekrar tekrar nasıl gönderirim? –

+0

Bu koddaki foreach döngüleri, parçalanmış verilerinizi otomatik olarak 8K paketlerinde göndermelidir. Bu, 1MB varsayılan ayar için yeterince küçük olmalıdır. – Phil

+0

"max_packet" boyutumun 1024 MB'ye ayarlı olması ve paketlerimi otomatik olarak göndermemesi, çıktı eksik olduğunda veriler. –

İlgili konular