PHP-метод для конкатенации массива и строки - PullRequest
0 голосов
/ 22 марта 2011

Я создаю класс PHP для управления базой данных, и мне было интересно, можно ли создать метод, который мог бы получить строку с объединенным массивом в качестве одной переменной.

Например, взгляните на этот упрощенный код:

class Database {
    function __construct() {
        // Connect to the database, code not shown
    }

    public function query($input) {
        // Do something with the input so the string values are recognized ...
        // and the array and its keys are converted into an SQL string.
        // Code not shown...

        mysql_query($processedInput);
        return true;
    }
}

Итак, в идеале, если я запусту что-то вроде этого ...

$db = new Database();
$db->query("UPDATE `table` SET " . 
            array("id" = "2",
                  "position" = "1",
                  "visible" = "1",
                  "name" = "My Name's John",
                  "description" = "This is neat!"
            ) . " WHERE `id` = '1'");

... PHP генерирует, а затем запускает этот SQL ...

mysql_query("UPDATE `table` SET `id` = '2', `position` = '1', `visible` = '1', 
`name` = 'My Name\'s John', `description` = 'This is neat!' WHERE `id` = '1'");

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

I хотел бы , чтобы избежать передачи нескольких значений в метод.

Ответы [ 2 ]

1 голос
/ 22 марта 2011

Вы можете написать своего рода вспомогательные функции, которые будут работать примерно так:

(внутри class Database {)

public function ArrayValues($array)
{
    $string = "";

    foreach($array as $Key => $Value)
    {
        $string .= "`$Key` = '$Value' ,";
    }
    // Get rid of the trailing ,

    // Prevent any weird problems
    if(strlen($string) > 1)
    {
        $string = substr($string, 0, strlen($string) - 2);
    }

    return $string;
}

Тогда вы будете использовать это как:

$db->query("UPDATE `table` SET " . 
            $db->ArrayValues(array("id" = "2",
                  "position" = "1",
                  "visible" = "1",
                  "name" = "My Name's John",
                  "description" = "This is neat!"
            )) . " WHERE `id` = '1'");

Я не проверял это, однако оно должно работать.

1 голос
/ 22 марта 2011

В Ruby вы можете сделать это, но вам не повезло в PHP.Хорошей новостью является то, что вы можете немного изменить то, что вы делаете, чтобы передавать запрос и параметры отдельно в качестве аргументов метода запроса:

$db->query("UPDATE `table` SET ? WHERE `id` = '1'", array(
  "id" = "2",
  "position" = "1",
  "visible" = "1",
  "name" = "My Name's John",
  "description" = "This is neat!"
);

И затем обрабатывать интерполяцию и конкатенацию в вашем объекте базы данных:

class Database {
    function __construct() {
        // Connect to the database, code not shown
    }

    public function query($query, $input) {
        $sql = $this->_normalize_query($query, $input)

        mysql_query($sql);
        return true;
    }

    protected function _normalize_query($query, $input) {
      $params = "";
      foreach($input as $k => $v) {
        // escape and assemble the input into SQL
      }
      return preg_replace('/\?/', $params, $query, 1);
    }
}

Однако

Уже есть много ORM, которые очень способны.Если вы ищете что-то, чтобы только собирать запросы и не управлять результатами, вы, вероятно, тоже сможете что-то найти.Похоже, вы без необходимости заново изобретаете колесо.

Хорошая PHP ORM библиотека?

...