在一部分代码中,我正在使用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()
,有人知道解决方案吗?
非常感谢!
答案 0 :(得分:1)
由于您没有使用each
提供的密钥,因此在这种情况下不需要。
由于数组是按拷贝而不是按引用传递的,因此,如果在相同的上下文中不再使用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) {
//...
}
答案 1 :(得分:0)
您不想在php脚本中执行此操作。我强烈建议您尽可能使用一些cronjob。
您可以使用
创建一个cronjobcrontab -e
并添加如下内容:
0 1 * * * mysqldump -e --user=username --password='password' dbname | gzip | uuencode
sql_backup.gz | mail example@example.com
上面的示例每天都会在凌晨01点启动工作。
您可以在此处签出manual。
希望有帮助! :)