Добавление переменной в массив находящийся в файле

zilon

Постоялец
Регистрация
30 Июл 2011
Сообщения
370
Реакции
146
Есть скрипт для добавления доменов в панельку ipsmgr, каждый добавленый домен он записывает массив который находится в файле config_domains_vip.php вот так

PHP:
$file = dirname(__FILE__).'\config_domains_vip.php';
$domann = ",\r\n                          '$domain' )";
$current = file_get_contents($file);
$current = str_replace ( ")", $domann, $current);
if(file_put_contents($file, $current))
{
      //echo 'домен добавлен в конфиг<br>';
      }else{
      //echo 'домен не записался в конфиг<br>';
 
}

то есть просто в самый конец массива, вместо закрывающей скобки, добавляет перенос строки и домен и скобку. Это всё работает но хочется по людски сделать. Как не будь так, потому что планирую делать скрипт удаления доменов, а он не будет нормально работать из за таких вот костылей

PHP:
<?php
 
//это работает
 
$massiv = array ('doman1.ru', 'doman2.ru', 'doman3.ru');
print_r($massiv);
echo '<br><br>------------<br><br>';
array_push($massiv, 'doman4.ru', 'doman5.ru');
print_r($massiv);
 
//это то что надо но не работает
$file = dirname(__FILE__).'/massiva.php';
$fp = fopen ($file, "w");
array_push($fp, 'doman4.ru', 'doman5.ru');
fclose($fp);
 
?>

вот сам скрипт для добавления доменов

PHP:
<?php
 
include ('config_vip.php');
include ('config_domains.php');
 
if (empty($_POST['domains'])) {
?>
<center>
<form method="post">
Домены списком, например nulled.cc<br>
<textarea name="domains" rows="25" cols="30"></textarea><br><br>
<input type="submit" value="Добавить">
</form>
</center>
<?
} else {
$domains = $_POST['domains'];
$ch = curl_init();
$auth_url = "https://$ip/manager/ispmgr?out=text&func=auth&username=$login&password=$pass";
curl_setopt($ch, CURLOPT_URL, $auth_url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
$auth = curl_exec($ch);
curl_close($ch);
$auth = str_replace("auth=", "", $auth);
$auth = trim($auth);
$domains = explode("\n", $domains);
foreach ($domains as $domain) {
        $domain = trim($domain);
        $ch = curl_init();
        $create_url = "https://$ip/manager/ispmgr?out=text&auth=$auth&func=domain.edit&sok=yes&webdomain=on&ip=$ip&ns=$ns1.%20$ns2.&mx=mail%20mail&owner=$owner&name=$domain";
        curl_setopt($ch, CURLOPT_URL, $create_url);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $data = curl_exec($ch);
        curl_close($ch);
 
        echo "<a href='http://$domain' target='blank'>$domain</a> $data <br>";
        flush();
        $file = dirname(__FILE__).'\config_domains_vip.php';
        $domann = ",\r\n                          '$domain' )";
        $current = file_get_contents($file);
        $current = str_replace ( ")", $domann, $current);
        if(file_put_contents($file, $current)){
        //echo 'домен добавлен в конфиг<br>';
        }else{
        //echo 'домен не записался в конфиг<br>';
        }
                }
echo 'готово!';
}
?>

подскажите пжалуста как записать добавленый домен в массив не стриг реплейсом а функцией array_push при том что массив, находится в файле :thenks:
 
Что тебе мешает пользоваться функциями unserialize и serialize?
 
много чего перепробовал максимум чего добился - получилось записать все домены в одну строку - домен1домен2домен3 а как масив записать?:alko:

PHP:
echo '<br><br>функция serialize<br><br>';
$ser = serialize ($doman);
print_r($ser);
echo '<br><br>функция unserialize<br><br>';
$unser = unserialize ($ser);
print_r($unser);
echo '<br><br>функция array_push<br><br>';
array_push($unser, $domain);
print_r($unser);
 
$file = dirname(__FILE__).'\config_domains_vip.php';
 
/* $file = dirname(__FILE__).'\config_domains_vip.php';
$domann = ",\r\n '$domain' )";
$current = file_get_contents($file);
$current = str_replace ( ")", $domann, $current);
*/
if(file_put_contents($file, $unser)){
echo 'домен добавлен в конфиг<br>';
}else{
//echo 'домен не записался в конфиг<br>';
}
 
file_put_contents как раз для serialize данных имеет смысл вызывать и с блокировкой файла на случай двойного запуска скрипта в одно и то же время:
PHP:
$arr = file_get_contents($file, LOCK_EX);
$arr = unserialize ($arr);

array_push($arr, $domain);
$ser = serialize ($arr);
file_put_contents($file, $ser, LOCK_EX);
 
я думал что в массиве если после последнего элемента будет запятая стоять то синтаксическая ошибка будет, оказалось что нет и можно так написать
PHP:
$doman = array
 
(
 
'doman1.ru',
'doman2.ru',
'doman3.ru',
 
);

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

ты получаешь свой массив
PHP:
$arr = file_get_contents($file, LOCK_EX);
$arr = unserialize ($arr);

добавляешь новый домен
PHP:
array_push($arr, $domain);

записываешь в файл новый массив
PHP:
$ser = serialize ($arr);
file_put_contents($file, $ser, LOCK_EX);

зачем ты что то еще неправильное придумал?
 
zilon, что ты мучаешься, тебе даже рабочий код дали.

он конечно работает, но не так как надо, перезаписывает в файл domains это - b:0; и пишет что warninng, в array_push() первый аргумент - массив

PHP:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">

<?php

if(isset($_POST['adddomains']))

{

    $domainss = $_POST['adddomains'];
    $domainss = explode("\n", $domainss);
    $file = dirname(__FILE__).'\domains.php';
    foreach ($domainss as $domann)
 
    {

        $arr = file_get_contents($file, LOCK_EX);
        $arr = unserialize ($arr);
        $ser = serialize ($arr);
        array_push($doman, $domain);
        file_put_contents($file, $ser, LOCK_EX);

    }
}

else {


echo"
<form method='post' action=''>
<div id=right>
<br>Форма добавления доменов<br><br>
каждый домен с новой строчки<br><br>
<textarea  name='adddomains' rows='15' cols='65'>besplatnie.ru
igrinatelefon.ru
igrinatelefonnokia.ru</textarea><br><br>
<input type='submit' value='Добавить домены'>
<br><br>
<!-- <input type='reset' name='reset' value='Очистить форму от доменов'> -->
</form>
</div>
<style type='text/css'>
#right {
  height:56px;
  right:10px;
  position:fixed;
  top:0%;
  z-index:2000;
  background: #fff;
}
</style>
</center>
";

}

?>

PHP:
<?php

$doman = array
 
    (

    'brauzernie-igri.ru',
    'igrinatelefon.ru',
    'igrinatelefonnokia.ru',

    );

?>

кто не верит, может проверить вот архивчик с двумя скриптами
 

Вложения

  • localhost.zip
    1 KB · Просмотры: 3
попробуй имена переменных называть по человечески, и сам путаться не будешь и другим глаза побережёшь :crazy:
PHP:
foreach ($domainss as $domann)
    {

       ...
        array_push($doman, $domain);
        ...

    }
domann, doman, domain -> WTF? а код вообще, одно пишет - другое присваивает, путаница на путанице
 
PHP:
Поправил сейв:

if(isset($_POST['adddomains']))
{
	$domainss = $_POST['adddomains'];
	$domainss = explode("\n", $domainss);
  
	$file = dirname(__FILE__).'\domains.php'; 

  if (count($domainss)) {
    $arr = file_get_contents($file, LOCK_EX);
    $arr = unserialize ($arr);
    if (!is_array($arr)) $arr = array();
    array_push($arr, $domainss);
    $ser = serialize ($arr);

    file_put_contents($file, $ser, LOCK_EX);
  }

}

PS вот зачем надо читать умные книжки по PHP, хотя бы первые главы, в которых рассказывается про циклы и типы данных.
PPS рекомендую Фленов "PHP глазами хакера"
 
Для просмотра ссылки Войди или Зарегистрируйся, только всё-таки array_merge, а не array_push.. а то вы создаёте вложенный массив, а не добавляете к существующему..
 
Назад
Сверху