php mysqli NEREDE IN (??? ...)

4 Cevap php

According to http://us2.php.net/manual/en/mysqli-stmt.bind-param.php, the different types are:

i   corresponding variable has type integer
d   corresponding variable has type double
s   corresponding variable has type string
b   corresponding variable is a blob and will be sent in packets

Ancak, nasıl bu işleyebilir:

->prepare("SELECT blabla FROM foo WHERE id IN (?)")

Nerede? kimlikleri bir liste olur. Bir veya daha fazla öğe olabilir:

$ids = "3,4,78";
->bind_param('s',$ids);

Bu mümkün mü?

Ben bir döngü içinde idam olacak çünkü hazır deyimleri kullanmak istiyorum.

4 Cevap

Doğru sözdizimi olacaktır

->prepare("SELECT blabla FROM foo WHERE id IN (?, ?, ?)")

örneğin, bu dizinin 3 öğeler için. Daha sonra bind_param() kullanılarak tek tek bu öğelerin her bağlamak gerekir.

Eğer dizide bir boyut garantisi yoksa, size 's "?" Doğru sayısı ile SQL oluşturmak için bir kaç yardımcı işlevlerini yazmak zorunda ve ifadeleri bağlamak olacak.

Eğer boyutu bir IN-tablosuna bağlamak için wanto her çağrıyı farklı değişkenlerin bir listesi varsa, en basit bir şekilde programlama SQL dizesi oluşturmak ve değişkenleri bağlamak için bir döngü kullanmak olacaktır :

/**
 * @param  array  $values
 * @param  mysqli $db
 * @return mysqli_stmt
 */
function bindInValues(array $values, mysqli $db)
{
    $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)',
        implode(', ', array_fill(0, count($values), '?'))
    );
    $stmt = $db->prepare($sql);
    foreach ($values as $value) {
        $stmt->bind_param('s', $value);
    }
    return $stmt;
}

Eğer isterseniz call_user_func_array Dinamik yöntem çağırma kullanmak ve bir döngü olmadan boyunca gidebilirsiniz.

/**
 * @param  array  $values
 * @param  mysqli $db
 * @return mysqli_stmt
 */
function bindInValues(array $values, mysqli $db)
{
    $sql = sprintf('SELECT blabla FROM foo WHERE id IN (%s)',
        implode(', ', array_fill(0, count($values), '?'))
    );
    $stmt = $db->prepare($sql);
    array_unshift($values, implode('', array_fill(0, count($values), 's')));
    call_user_func_array(array($stmt, 'bind_param'), $values);
    return $stmt;
}

Ne yapıyor hakkında:

$sql = sprintf("SELECT blabla FROM foo WHERE id IN(%s) ", $ids);
$stmt = $mysqli->prepare($sql);
if (!$stmt) {
    $this->throwException();
}

if (!$stmt->execute()) {
    $this->throwException();
}

Iyi değilse, neden bu kadar benim hataları öğrenebilirsiniz söyle lütfen. Teşekkürler!

Ben sorumun cevabını buldum:

->prepare("SELECT stuff FROM table_name WHERE id IN (?)");

$itemList = implode(',',$items);
$children->bind_param('s',$itemList);

Seems to be working fine when using a string with coma-separated values. I'm still checking if the results are really accurate ...