Mysqli tablolarını ile nasıl cümlelerinde kullanıyorsunuz

3 Cevap php

Ben hazırlanmış deyimleri kullanarak yeni msqli arayüze bazı eski kod ilerliyorum, ben IN yan tümcesi içeren SQL deyimleri ile sorun yaşıyorum. Ben sadece normalde bu yapardı:

$ids = '123,535,345,567,878'
$sql = "SELECT * FROM table WHERE id IN ($ids)";
$res = mysql_query($sql);

Mysqli'nin ve çözümleri bir dizi denedim hazırlanan tablolarda bu dönüştürme:

$ids = '123,535,345,567,878'
$ids = implode($ids,',');
$result = $msqli->prepare("SELECT foo,blar FROM table WHERE id IN (?));
$result->bind_param("i", $ids);
$result->execute();

Yukarıdaki başarısız olur ve SQL dize soru işaretleri dizi ve değiştiren sayıda elemanların sayısını hesaplamak ve dizideki her öğe için bind_parm çağrısında da başarısız olur. Sadece virgülle ayrılmış dize de başarısız kullanarak.

Bunun üzerine Google hiç iyi belgeleri bulabilirsiniz, bu yüzden nasıl sorunu çözmüş?

3 Cevap

(Ikinci örnek kod) önce burada sorulan benzer bir soruya cevap bakın:

I have an array of integers, how do I use each one in a mysql query (in php)?

Bu aşağı kaynar:

  • soru işaretlerinin doğru miktarda SQL dizesi oluşturmak
  • Sorgu dizesi için dizi bağlamak için call_user_func_array() kullanın

Tek bir bağlı değişken değişken uzunlukta bir listesini bağlamak mümkün değildir.

Eğer dize bağlamak olsaydı Benzer şekilde, $ids aslında ile bitireceğiz:

SELECT foo,blar FROM table WHERE id IN ('123,535,345,567,878')

(Kimlikleri liste etrafında tırnak unutmayın).

Soru işaretleri ve bağlı parametrelerin doğru sayısı ile kendi sorgu oluşturma aslında çalışmış olmalıdır - tekrar denemek ve gerçek hata rapor gerekebilir.

Alternatif olarak, bu sizin kendi SQL-zanaat el maalesef gerekli bu vesilelerle biri olmak ve bağlı parametreleri kullanamaz.

Ben hazırlanan tabloların noktası sadece yapabileceği bu durum o kadar da düşündüm:

$stmt = $this->mysqli->prepare("UPDATE radcheck SET attribute = ?, value = ?  WHERE username = ? AND attribute LIKE 'CS-Total-Octets%'");
foreach ($usernames as $username)
{
    $stmt->bind_param('sss', $bandwidth_types[$bandwidth_type], $bandwidth_bytes, $username);
    $stmt->execute();
}
$stmt->close();