modifikasyonlarla yeniden kullanılabilir bir sorgu?

4 Cevap php

Birden fazla anahtar kelime aramak için php alongwith bu mysql sorgu kullanıyorum:

$query = "SELECT cQuotes, vAuthor, cArabic, vReference FROM ".$table." WHERE (";
  $countFields = count($arrayFields);
  while ($a < $countFields)
  {
    while ($b < $countSearch)
    {
      $query = $query."$arrayFields[$a] LIKE '%$arraySearch[$b]%'";
      $b++;
      if ($b < $countSearch)
      {
        $query = $query." AND ";
      }
    }
    $b = 0;
    $a++;
    if ($a < $countFields)
    {
      $query = $query.") OR (";
    }
  }
  $query = $query.")";
  $result = mysql_query($query, $conn)

(I COUNT kullanarak satır sayısını sorgulamak ise, örneğin, WHERE, aynı kalır) buna bir kaç değişiklik ile bu sorguyu yeniden isterdim, ama için yine kodunu tekrarlamak için pratik görünmüyor Birkaç eklemeler. herhangi bir öneriniz?

4 Cevap

Ben eksik kod var bu yana ne yaptığınızı exactly Anlamıyorum, ama ben şu öneririm:

Dizilerle süre kullanmayın; çok daha kompakt ve o için yapılan buydu foreach kullanın.

Kullanmak, el dizeleri bitiştirmek etmeyin implode ()

Sonucu saymak için SQL karmaşıklığı eklemek etmeyin; MySQL yerine en FOUND_ROWS () kullanın.

Biraz ilgisiz not ben mysqli'nin için PHP'nin mysql kütüphane yükseltme öneririm. Bu sizin hayatınızı kolaylaştıracak birden çok sorgular, izin verir.

<?php

$table = "myTable";
$justCount = true;
$requiredFields = array('cQuotes', 'vAuthor', 'cArabic', 'vReference');
$arrayFields = array('cQuotes','vAuthor');
$arraySearch = array('blah','foo','bar');

///////////////
$selectWhat = $justCount ? "COUNT(*)" : implode(',', $requiredFields);

$wherePart = array();
foreach($arraySearch as $search)
{
    $subWherePart = array();
            foreach($arrayFields as $field)
    {
        $subWherePart[] = $field . " LIKE '%" . $search ."%'";
    }
    $wherePart[] = "(" . implode(" AND ", $subWherePart) . ")";
}

$query = "SELECT " . $selectWhat . " FROM " . $table
        . " WHERE " . implode(" OR ", $wherePart);

?>

SQL Injeciton önlemek için giriş arama sözcükleri filtrelemek unutmayın.

Daha sonra bunu istediğiniz sorguyu sürümünü işlevini anlatan bir parametre göndermek, ayrı bir işlev içine bu kodu çekmek olabilir. Işlevi daha sonra sorgu oluşturmak ve dize dönecekti. Ben de hazır ifadeler sizin için faydalı olabileceğini düşünüyorum.

Bu sorun tekrar tekrar oluyor, özellikle bir sorgu oluşturucu kitaplık veya ORM kullanarak deneyebilirsiniz. Onlar işlevsel SQL oluşturmak için izin verir. I Doctrine veya Sqloo kullanarak öneririm (spoiler uyarısı: Ben Sqloo yaratıcısı değilim). Eğer işlevsel SQL oluşturmak için kullanabilirsiniz bu yana, hatta kod çok yüksek bir yeniden kullanım için izin vermek için, onlar itiraz beri etrafında kısmi sorguları iletebilirsiniz.

Doctrine ve Sqloo için bir kaç örnektir.