каждый () устарел, проблемы, чтобы избавиться от - PullRequest
0 голосов
/ 20 октября 2018

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

if (!isset($table_select))
{
$result = $dbc->prepare("show tables");
$i=0;
$table="";
$tables = $dbc->executeGetRows($result);
foreach ($tables as $table_array)
{
list(,$table) = each($table_array);
$exclude_this_table = isset($table_exclude)? in_array($table,$table_exclude) : false;
if(!$exclude_this_table) $table_select[$i]=$table;
$i++;
}
}

Я не знаю, как избавиться от этой части: list(,$table) = each($table_array);

Поскольку each() устарело, кто-нибудь знает решение?
Большое спасибо!

Ответы [ 2 ]

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

Поскольку вы не используете ключ, предоставляемый each, в этом контексте он не нужен.

Пример: https://3v4l.org/8vie4

Поскольку массивы передаются путем копированиявместо ссылки, вы можете использовать array_shift() в качестве альтернативы, если вы не используете $table_array снова в том же контексте.

foreach ($tables as $table_array) {
    $table = array_shift($table_array);
    var_dump($table);
}

Имейте в виду, что array_shift извлекает текущее значение и удаляет его из массива.

Поскольку each() извлекает текущую пару значений ключей и перемещает указатель на следующее значение,Вы можете заменить его на current() и next().

foreach ($tables as $table_array) {
    $table = current($table_array);
    var_dump($table);
    next($table_array);
}

Если вам нужно key текущего значения при использовании current и next, вы можете использовать key()

foreach ($tables as $table_array) {
    $key = key($table_array);
    $table = current($table_array);
    var_dump($key, $table);
    next($table_array);
}

Поскольку используемый сценарий автоматического резервного копирования использует PDO , вы можете уменьшить сложность, используя fetchAll(PDO::FETCH_COLUMN); вместо executeGetRows, что приведет к получению плоского массиваиндексированный столбец 0, а не пара ключ-значение столбца.

$result = $dbc->prepare("show tables");
$result->execute();
$i=0;
$table="";
$tables = $result->fetchAll(\PDO::FETCH_COLUMN);
foreach ($tables as $table) {
     //...
}
0 голосов
/ 20 октября 2018

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

Вы можете создать cronjob, используя

crontab -e

и добавить что-то вроде:

0 1 * * * mysqldump -e --user=username --password='password' dbname | gzip | uuencode
sql_backup.gz | mail example@example.com

Приведенный выше пример запускает работу каждый день в 01:00.

Вы можете ознакомиться с руководством здесь.

Надеюсь, это поможет!:)

...