【问题标题】:each() deprecated, trouble to get rid ofeach() 已弃用,麻烦摆脱
【发布时间】:2019-03-25 06:54:36
【问题描述】:

我正在使用 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() 已被弃用,有谁知道解决方案吗?
非常感谢!

【问题讨论】:

  • 你为什么用php?而不是简单地导出它?
  • 因为这个脚本可以定期将数据库发送到我的邮箱(并保存在云存储中)。
  • 1 行mysqldump --add-drop-table --user="*" --password="*" --host="127.0.0.1" dbname | mail -s backup user@example.com

标签: php foreach each php-7.2


【解决方案1】:

由于您没有使用each 提供的密钥,因此在此上下文中不需要它。

示例:https://3v4l.org/8vie4

由于数组是按复制而不是按引用传递的,因此如果您不在同一上下文中再次使用$table_array,则可以使用array_shift() 作为替代方案。

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);
}

如果您在使用currentnext 时确实需要当前值的key,您可以使用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) {
     //...
}

【讨论】:

  • 非常感谢。你是我的超级英雄。奇迹般有效。非常感谢你的好意。
  • @Aska 如果您认为我的回答解决了您的问题,请点赞或将其标记为已接受的答案,以便其他人知道您的问题不再需要答案。
【解决方案2】:

您不想在 php 脚本中执行此操作。我强烈建议您尽可能使用一些 cronjob 来完成此任务。

您可以使用

创建一个 cronjob
crontab -e

并添加如下内容:

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

上面的示例会在每天凌晨 1 点启动作业。

您可以在此处查看manual

希望对您有所帮助! :)

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 2020-04-20
    • 2021-05-06
    • 1970-01-01
    • 2018-03-12
    相关资源
    最近更新 更多