Ben tamsayılar dizisi, nasıl her biri (php) bir mysql sorguda kullanmak yok değil mi?

4 Cevap php

Ben rastgele içerik öğesi kimlikleri tam bir dizi var. Ben onlar dedi dizide göründükleri sırayla, dizideki var her kimliğini kullanarak, bir mysql sorgu (dizi id WHERE yan tümcesinde gider) çalıştırmak gerekir. Bunu nasıl yaparım?

Bu dizideki her kimliği için, bir UPDATE sorgusu olacaktır.

4 Cevap

Neredeyse tüm gibi sorulara "Ben PHP içinde SQL nasıl yaparsınız" - Sen really hazırlanmış ifadeler kullanmak gerekir. O kadar zor değil:

$ids  = array(2, 4, 6, 8);
$sql  = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = ?";
$stmt = $mysqli->prepare($sql);
for ($i = 0; $i < count($ids); $i++)
{
    $stmt->bind_param("i", $ids[$i]);
    $stmt->execute();
    echo "Updated record ID: $id\n";
}
$stmt->close();

Alternatif olarak, bu satırlar boyunca bunu yapabilirsiniz:

$ids    = array(2, 4, 6, 8);
$params = implode(",", array_fill(0, count($ids), "?"));
$sql    = "UPDATE MyTable SET LastUpdated = GETDATE() WHERE id IN ($params)";
$stmt   = $mysqli->prepare($sql);

call_user_func_array(array($stmt, 'bindparams'), $ids);
$stmt->execute();
$stmt->close();
echo "Updated record IDs: " . implode("," $ids) ."\n";

Her döngü tekrarında tablosuna farklı veri bağlayabilirsiniz ilk seçeneği kullanırken Ama açıkçası ikinci seçenek, sadece aynı veri ile etkilenen tüm kayıtları güncellemek için sınırı olacaktır.

Bir hazır deyimi çağıran bir sürü (mümkünse hiçbir SQL enjeksiyonu) daha güvenli ve sadece parametre değerleri execute() yerine bütün tabloların üzerine sunucuya gönderilir, çünkü bir döngü içinde bunu yaparken, hem de daha verimli olmasıdır. Uzun süren döngüler bu fark kesinlikle fark olacaktı.

Using the "IN" Clause

Sonra konum ne olabilir

$ids = array(2,4,6,8);
$ids = implode($ids);
$sql="SELECT * FROM my_table WHERE id IN($ids);";
mysql_query($sql);

Aksi takdirde, ne yanlış

$ids = array(2,4,6,8);
foreach($ids as $id) {
    $sql="SELECT * FROM my_table WHERE ID = $id;";
    mysql_query($sql);
}

Amin tablolara Tomalak yorumuna.

Mysqli kullanmak istemiyorsanız Ancak, her zaman enjeksiyonu önlemek için () intval kullanabilirsiniz:

$ids  = array(2, 4, 6, 8);
for ($i = 0; $i < count($ids); $i++)
{
    mysql_query("UPDATE MyTable SET LastUpdated = GETDATE() WHERE id = " . intval($ids[$i]));
}

Ancak aksi SQL enjeksiyonu ile bitebileceğini dizisi yalnızca tamsayı içerdiğini ÇOK dikkatli olmak gerekir, aşağıdaki gibi bir şey yapabilirdi.

Eğer gerçekten bunu yardımcı olabilir eğer içeriği almak için birden fazla sorguları yapıyor olmak istemiyorum. Böyle bir şey, sonra ne olabilir.

foreach ($array as $key = $var) {
   if ((int) $var <= 0) {
       unset($array[$key]);
   }
}


$query = "SELECT * 
from content 
WHERE contentid IN ('".implode("','", $array)."')";

$result = mysql_query($query);