Как я могу передать много столбцов в bind_result () с большей гибкостью? - PullRequest
0 голосов
/ 27 октября 2018

У меня есть длинная таблица MySQL, дизайн которой еще не полностью исправлен.Поэтому иногда мне нужно добавлять / удалять некоторые столбцы.Но каждый раз, когда я изменяю таблицу, я должен переписывать всю строку, связанную с bind_result ().Я ищу решение, которое облегчает это изменение.

Предположим, у меня в настоящее время есть таблица со столбцами, такими как col_a, col_b, col_c, ..., col_z.Поэтому я использую bind_result () для хранения значений результатов, как сказано в руководстве.

$res = $stmt->bind_result($a, $b, $c,..., $z);

Но, если я изменю дизайн таблицы, я должен изменить параметры всех строк, имеющих отношение к этому bind_result (), насоответствовать новой таблице MySQL.

Есть ли какая-либо техника, подобная следующей?

// Some php file defining constants
define("_SQL_ALL_COLUMNS", "\$a, \$b, \$c, \$d, ... \$z");

// Some SQL process in in other php files
stmt->execute();
$res = $stmt->bind_result(_SQL_ALL_COLUMNS);

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

Есть ли какое-нибудь хорошее решение для такого типа ситуации?

1 Ответ

0 голосов
/ 27 октября 2018

Используйте call_user_func_array() для динамической установки количества параметров:

function execSQL($con, $sql, $params = null)    
    $statement = $con->prepare($sql);
    if (!$statement){
        // throw error 
        die("SQL ERROR: $sql\n $con->error");
    }

    $type = "";
    $arg = array();
    if ($params && is_array($params)){
        foreach($params as $param){
            if (is_numeric($param)){
                $type .= 'd';
                continue;
            }
            $type .= 's';
        }

        $arg[] = $type;
        foreach($params as $param){
            $arg[] = $param;
        }

        call_user_func_array(array($statement,'bind_param'), refValues($arg)); // php 7
    }
    $res = $statement->execute();

    if (!$res){
        die("Looks like the Execute Query failed.\n\nError:\n{$statement->error}\n\nQuery:\n{$sql}\n\nParams:\n{".implode(",", $arg)."}");
    }
    return $con->insert_id;
}

function refValues($arr){
    if (strnatcmp(phpversion(),'5.3') >= 0) { //Reference is required for PHP 5.3+
        $refs = array();
        foreach($arr as $key => $value){
            $refs[$key] = &$arr[$key];
        }
        return $refs;
    }
    return $arr;
}

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

$result = execSQL($connection,$sql,["a","b","c","..."]);

Для этого проверяется тип данных параметров и добавляется переменная $type, которая затем передается методу привязки в качестве первого параметра.

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