Hazırlanmış deyimleri kullanarak mysql ikili verileri PHP-ekleme

2 Cevap php

I have to insert a row using php's mysql improved library to a table in mysql that has its primary key of type VARBINARY. The contents of this field are a computed sha1 hash.

Ben sorgu mükemmel çalışıyor eski yol çalıştırın:

$mysqli->$query("INSERT INTO table (id, field1) VALUES (0x" . $id . ",'" . $field1 . "')");

But when I try to execute it as a prepared statement, I can't figure out how to do it. If I perform the equivalent action:

if($stmt = $mysqli->prepare("INSERT INTO table (id, field1) VALUES (?, ?)")) {
    $stmt->bind_param('ss', "0x".$id, $field1);
    //execute statement
}

Bu içeriği bu alan için çok büyük olduğunu söyleyerek bir istisna atar. Ve ben bir BLOB alan olarak eklemek için deneyin:

if($stmt = $mysqli->prepare("INSERT INTO table (id, field1) VALUES (?, ?)")) {
    $stmt->bind_param('bs', $id, $field1);
    //execute statement
}

Hiçbir hata, satır yerleştirilmezden verir, ancak tanımlayıcı alanı şimdi (boş, boş değil) boştur.

Ben sorgu ve giriş dizesi ve hazır deyimi bağlaması parametreler olarak diğer alanlarda birleştirilmiş id karıştırıp biliyorum, ama ben sadece bu eklemek ve belki de birilerini yardımcı olacak doğru yolu nedir bilmek istiyorum gelecek.

2 Cevap

PHP'nin sha1 function onaltılık sayının dize temsilini döndürür.

Ne demektir ki ekrana yazdırmak, eğer bir onaltılık sayısını görüntülemek edeceksiniz. Ancak bellekte, ASCII karakterleri bir demet.

Yani, altıgen numarasını 1A2F alır. Olur edilmesi 0x31413246, yerine 0x1A2F bellekte ASCII gibi

MySQL normal arayüzü dizeleri gibi tüm argümanları gönderir. Normal arabirimini kullanırken, MySQL bir ikili değer ASCII dizesi dönüştürmek olacaktır.

Yeni hazırlanmış deyimi yöntem ikili gibi her şeyi gönderir. Yani "1A2F" senin güzel değeri, şimdi 0x31413246 olarak gönderilir ve sütuna eklenecektir. - source: dev.mysql.com - Prepared statements

Bunun yerine, kullanarak bir ikili dize içine ambalaj tarafından Hex dize dönüştürmek:

$binId = pack("H*", $id); // this string is not ASCII, don't print it to the screen! That will be uggly.

ve ardından $binId $ yerine id bildirimde hazırlanan MySQLi geçmek.

Bunun yerine bu deneyin:

if($stmt = $mysqli->prepare("INSERT INTO table (id, field1) VALUES (unhex(?), ?)") {
    $stmt->bind_param('ss', $id, $field1);
    //execute statement
}