повторно используемый запрос с изменениями? - PullRequest
1 голос
/ 05 мая 2010

Я использую этот запрос MySQL вместе с PHP для поиска нескольких ключевых слов:

$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)

Я хотел бы повторно использовать этот запрос с несколькими изменениями к нему (например, предложение WHERE остается прежним, в то время как я запрашиваю количество строк с помощью COUNT), но повторять код не представляется целесообразным снова за несколько дополнений. какие-либо предложения?

Ответы [ 4 ]

1 голос
/ 05 мая 2010

Вы можете попробовать использовать библиотеку построителя запросов или ORM, особенно если эта проблема повторяется. Они позволяют создавать SQL функционально. Я бы предложил использовать Doctrine или Sqloo (предупреждение о спойлере: я создатель Sqloo). Поскольку вы можете использовать их для функционального создания SQL, вы можете даже передавать частичные запросы, поскольку они возражают, что позволяет очень многократно использовать код.

Несколько примеров Доктрины и Sqloo .

1 голос
/ 05 мая 2010

Вы можете извлечь этот код в отдельную функцию, а затем отправить ему параметр, сообщающий функции, какую версию запроса вы хотите. Функция тогда создаст запрос и вернет строку. Я также думаю, что подготовленные заявления могут быть полезны для вас.

1 голос
/ 05 мая 2010

Я не понимаю точно , что вы делаете, поскольку отсутствует код, но я бы предложил следующее:

Не используйте в то время как с массивами; используйте foreach, это намного более компактно, и это - то, для чего это было сделано.

Не объединять строки вручную, используйте implode ()

Не добавляйте сложности в ваш SQL для подсчета результата; используйте взамен MYSQL FOUND_ROWS ().

В какой-то не связанной заметке я бы предложил обновить PHP-библиотеку mysql до mysqli. Это позволяет несколько запросов, которые сделают вашу жизнь проще.

1 голос
/ 05 мая 2010
<?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-инъекций.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...