Autor Zpráva
Senky
Profil
Zdravím. Mám maličký problém. Snaží sa pridať užívateľov do phpbb fóra tak, aby sa mohli hromadne vpísať do textare-y a každý užívateľ by sa vpísal ako email do nového riadku.
Príklad:
senky@gmail.com
senky92@zoznam.sk

atď...
Potom to rozložím a cez while vpíšem do databázy. Nastávajú mi však 2 zúfalé situácie.
Prvá:
if( isset($_POST['user_add']) and isset($_POST['user_list']) )
{
  $user_list = request_var('user_list', '', true);
  $users = split("\n", $user_list);
  while( $users )
  {
    $username = split("@", $users [0]);

    $check_user_existion_sql = "SELECT username
                                FROM " . USERS_TABLE . "
                                WHERE username = '" . $username[0] . "'";
    $check_user_existion_result = $db->sql_query($check_user_existion_sql);
    $check_user_existion_row = $db->sql_fetchrow($check_user_existion_result);
    if($check_user_existion_row['username'] == $username[0])
    {
      $user_row = array(
        'username'              => $username[0],
        'user_password'         => phpbb_hash($username[0]),
        'user_email'            => $users [0],
        'group_id'              => 2, // by default, the REGISTERED user group is id 2
        'user_timezone'         => (float) $data['tz'],
        'user_lang'             => 'sk',
        'user_type'             => USER_NORMAL,
        'user_ip'               => $user->ip,
        'user_regdate'          => time(),
      );
      user_add($user_row);
      $template->assign_block_vars('addedrow', array(
        'USER_ADDED'            => $username[0],
      ));
    }
  }
}

skúsil som to takto. Funkcie sú správne a všetko ohľadom nich funguje ako má. Problém je však v tom, že sa mi to začne cykliť a neviem, ako upraviť podmeineku tak, aby to fungovalo. Našiel som aj na php.net, že to môžem vyskúšať takto:
if( isset($_POST['user_add']) and isset($_POST['user_list']) )
{
  $user_list = request_var('user_list', '', true);
  $users = split("\n", $user_list);
  while( $usersadd = current($users) )
  {
    $username = split("@", $usersadd[0]);

    $check_user_existion_sql = "SELECT username
                                FROM " . USERS_TABLE . "
                                WHERE username = '" . $username[0] . "'";
    $check_user_existion_result = $db->sql_query($check_user_existion_sql);
    $check_user_existion_row = $db->sql_fetchrow($check_user_existion_result);
    if($check_user_existion_row['username'] == $username[0])
    {
      $user_row = array(
        'username'              => $username[0],
        'user_password'         => phpbb_hash($username[0]),
        'user_email'            => $usersadd[0],
        'group_id'              => 2, // by default, the REGISTERED user group is id 2
        'user_timezone'         => (float) $data['tz'],
        'user_lang'             => 'sk',
        'user_type'             => USER_NORMAL,
        'user_ip'               => $user->ip,
        'user_regdate'          => time(),
      );
      user_add($user_row);
      $template->assign_block_vars('addedrow', array(
        'USER_ADDED'            => $username,
      ));
    }
    next($users);
  }

}

avšak to mi už ani nevypíše chybu sql o duplikátnom vkladaní...
Nevedel by mi niekto poradiť, ako upraviť podmienku, aby sa mi príkaz necyklil?
Ďakujem...
Joker
Profil
Senky:
V tom while cyklu nevidím nikde opuštění cyklu a samotný obsah proměnné $users se taky nemění, takže to logicky z toho cyklu už nevyleze.
(pokud se $users vyhodnotilo jako true a uvnitř cyklu se nikde nemění, logicky se v dalším běhu cyklu zase vyhodnotí jako true)

Funkce split vrací pole, nemá tam místo while být foreach?
Mimochodem, funkce split() má být v příští verzi PHP odstraněna (viz manuál), takže bych na ni moc nespoléhal.
Senky
Profil
Viem, že tam je niekde chyba...
A nemohol by si mi prosím ťa napísať foreach? Pretože to ako jediné nejako dobre neovládam...
A split môžem teda nahradiť, pohrám sa s tým...
Majkl578
Profil
[#3] Senky
Já asi špatně slyším. Někdo kdo upravuje phpbb3 a nechápe foreach...

split nahradit za explode nebo preg_split.

foreach funguje takto:
$pole = array('a', 'b', 'c');
foreach ($pole as $key => $value) {
  echo "$key => $value\n";
}
/*
Vypíše:
0 => a
1 => b
2 => c
*/
Senky
Profil
No neviem, či som foreach správne pochopil, vytvoril som toto:
if( isset($_POST['user_add']) and isset($_POST['user_list']) )
{
  $user_list = request_var('user_list', '', true);
  $users = explode("\n", $user_list);
  foreach($users as $key => $value)
  {
    $username = explode("@", $value[0]);

    $check_user_existion_sql = "SELECT username
                                FROM " . USERS_TABLE . "
                                WHERE username = '" . $username[0] . "'";
    $check_user_existion_result = $db->sql_query($check_user_existion_sql);
    $check_user_existion_row = $db->sql_fetchrow($check_user_existion_result);
    if($check_user_existion_row['username'] == $username[0])
    {
      $user_row = array(
        'username'              => $username[0],
        'user_password'         => phpbb_hash($username[0]),
        'user_email'            => $value[$key],
        'group_id'              => 2, // by default, the REGISTERED user group is id 2
        'user_timezone'         => (float) $data['tz'],
        'user_lang'             => 'sk',
        'user_type'             => USER_NORMAL,
        'user_ip'               => $user->ip,
        'user_regdate'          => time(),
      );
      user_add($user_row);
      $template->assign_block_vars('addedrow', array(
        'USER_ADDED'            => $username,
      ));
    }
  }
}

avšak stýle to nepridáva užívateľov... Tak teraz neviem, prečo. Asi kvôli tomu foreach, ale neviem už ako ináč by som mohol...

Ináč, phpbb3 sa venujem už dosť dlho... A doteraz som sa zaobišiel bez foreach, teda aspoň mi to fungovalo správne...
fajzen
Profil
Skús namiesto
$username = explode("@", $value[0]);

toto:
$username = explode("@", $value);


ďalej neviem, čo má byť tu:
$template->assign_block_vars('addedrow', array(
        'USER_ADDED'            => ???
));

ale teraz je tam niečo ako:
$template->assign_block_vars('addedrow', array(
        'USER_ADDED'            => array('senky', 'gmail.com')
));

a tá čiarka za $username nepatrí (nehádzalo to parse error?)
Joker
Profil
Senky:
Ináč, phpbb3 sa venujem už dosť dlho... A doteraz som sa zaobišiel bez foreach, teda aspoň mi to fungovalo správne...
Majkl578 je asi spíš překvapený, že se někdo vcelku bez znalostí programování (nic ve zlém, ale jak funguje cyklus nebo jaký je rozdíl mezi skalární proměnnou a polem jsou opravdu základní věci) pouští do úprav něčeho tak složitého jako je phpBB.
Senky
Profil
fajzen:
ďalej neviem, čo má byť tu:
>
1
2
3
>
$template->assign_block_vars('addedrow', array(
'USER_ADDED' => ???
));
No ono to je len menšia úprava, ktorá by mi mala vypísať potom v template (ktorý sa parsuje) všetkých užívateľov, ktorých to pridalo, avšak nezobrazuje to... Parse error to nehádzalo, prečo neviem, avšak je to robené takto v celom phpbb, takže som to iba skopíroval...

Skúsil som zmeniť to $value[0] na $value avšak stále to nefunguje :( Problém je v tom, že ani neviem, či to v poriadku dôjde k funkcii user_add, pretože tá vôbec nemá nejaké chybové hlášky...

Joker:
Ja keď sa tak nad tým zamyslím, tak tiež netuším. Urobil som aj mod, ktorý mi phpbb mod team schválil a nebol problém a s mojími skúsenosťami (ktoré nie sú najbohatšie) som to zvládol... Toto je už však trošku iné. Vlastne mám problém iba s tým cyklom, ostatné zvládam, ale fakt ako sa snažím, tak sa snažím, rôzne to skúšam obmieňať a nejde to. Aby vás to nemýlilo, skrátil som to na najkratšie možné, čo som dokázal:
if( isset($_POST['user_add']) and isset($_POST['user_list']) )
{
  $user_list = request_var('user_list', '', true); // vziať hodnotu z textare-y
  $users = explode("\n", $user_list); // rozdeliť emaily po riadku
  foreach($users as $key => $value)
  {
    $username = explode("@", $value);

    $check_user_existion_sql = "SELECT username
                                FROM " . USERS_TABLE . "
                                WHERE username = '" . $username[0] . "'";
    $check_user_existion_result = $db->sql_query($check_user_existion_sql);
    $check_user_existion_row = $db->sql_fetchrow($check_user_existion_result);
    if($check_user_existion_row['username'] == $username[0])
    {
      $user_row = array(
        'username'              => $username[0],
        'user_password'         => phpbb_hash($username[0]),
        'user_email'            => $value[$key],
        'group_id'              => 2, // by default, the REGISTERED user group is id 2
        'user_timezone'         => (float) $data['tz'],
        'user_lang'             => 'sk',
        'user_type'             => USER_NORMAL,
        'user_ip'               => $user->ip,
        'user_regdate'          => time(),
      );
      user_add($user_row);
    }
  }
}

Ono mi to fungovalo bez tej podmienky, ktorá zisťuje, či takýto užívateľ už nie je... Avšak ak som napísal nejaký email, ktorý mal aspoň začiatok rovnaký dalo mi to sql chybu a tak som tam potreboval pridať aj tú podmienku a od vtedy to nejde...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0