【问题标题】:How to put foreach into separate variables?如何将 foreach 放入单独的变量中?
【发布时间】:2014-04-12 11:49:08
【问题描述】:

我已经在这个论坛上搜索了 2 天,但我似乎无法掌握“foreach”的东西。

我发现了这个:

这正是我需要的,但是! 如何获得输出 "echo "$key = \"$value\"
";"在可重用变量中???

    <?php
    /* Create Array named $profile with contents of jos_users */
    $user =& JFactory::getUser();
    foreach ($user as $key => $value)
    {
    $profile[$key] = $value;
    }

    /* Extract jos_user_profiles data and add to $profile */
    $db = JFactory::getDBO();
    $query = $db->getQuery(true);
    $query->select('profile_key, profile_value');
    $query->from('#__user_profiles');
    $query->where('user_id = '. (int) $user->id);
    $db->setQuery($query);
    $rows = $db->loadObjectList();
    foreach ($rows as $row)
    {
    $profile[$row->profile_key] = $row->profile_value;
    }

    /* Included for debugging purposes only 8*/
    foreach ($profile as $key => $value)
    {
    echo "$key = \"$value\"<br/>";
    }
    ?>

生成的输出如下:

    id = "636"
    name = "test2"
    username = "test2"
    email = "test2@test.nl"
    password = "$P$DcH9yo/xVoU7vTXgvmwCrCn5dDwfnE0"
    password_clear = ""
    block = "0"
    sendEmail = "0"
    registerDate = "2014-04-11 18:49:24"
    lastvisitDate = "2014-04-12 07:51:45"
    activation = ""
    params = "{}"
    groups = "Array"
    guest = "0"
    lastResetTime = "0000-00-00 00:00:00"
    resetCount = "0"
    _errors = "Array"
    aid = "0"
    otpKey = ""
    otep = ""
    testprofile.phonenumber = "523657543763"

我想要的是输出到变量中,比如“id = “636””变成 $id = “636”,或者 $variablename = “636”

有没有一种方法可以从上述代码生成/声明自动变量? (并列出它们,这样我就可以看到声明了哪些变量)。

我想做的是:

从 $user 获取数据并重复使用这些数据以通过此代码将更改的 mysql 数据插入/更新到 MsSQL 数据库中:

    include ('includes/connectwk.php');

    $sql = "select DEEL_ID, DEEL_TEAM, DEEL_NAAM, DEEL_TELEFOON, DEEL_MAIL from         WK_DEELNEMERS where DEEL_ID = '$usr_id'";
    $stmt = sqlsrv_query( $conn, $sql );

    if( $stmt === false)
    {
    die( print_r( sqlsrv_errors(), true) );
    echo 'connection failed!';
    }

    //script part
    if ($usr_id === 0 or $usr_login === null)
    {}
    else
    {
    if (sqlsrv_has_rows($stmt))
    {
    while( $row = sqlsrv_fetch_array( $stmt, SQLSRV_FETCH_ASSOC))
    {
        $c_id   =   $row['DEEL_ID'];
        $c_team =   $row['DEEL_TEAM'];
        $c_naam =   $row['DEEL_NAAM'];
        $c_tel  =   $row['DEEL_TELEFOON'];
        $c_mail =   $row['DEEL_MAIL'];

        if ($usr_id === $c_id and $usr_login === $c_team and $usr_mail === $c_mail and $row['DEEL_NAAM'] === $usr_name)
        {
        $update = false;
        }
        else
        {
        $update = true;
        }
    }
}
else
{
$sql = "insert into WK_DEELNEMERS (DEEL_ID, DEEL_TEAM, DEEL_NAAM, DEEL_TELEFOON, DEEL_MAIL) values ('$usr_id','$usr_login','$usr_name','','$usr_mail')";
$stmt = sqlsrv_query( $conn, $sql );
echo 'insert uitgevoerd';
}
if ($update === true)
{
    $sql ="update WK_DEELNEMERS set DEEL_TEAM = '$usr_login',DEEL_NAAM = '$usr_name',DEEL_TELEFOON ='bla3',DEEL_MAIL= '$usr_mail' where DEEL_ID = '$usr_id '"; 
    $stmt = sqlsrv_query( $conn, $sql );
}

    }
    ?>

可能这不是这样做的方法,但在我学习的过程中,请随时“推动”我朝着正确的方向前进。 :)

简而言之,我想要完成的是,从 mssql prefix_user 表和 prefix_user_profiles 表中获取数据。

将这些结果与我从 MsSQL 表中获得的结果进行比较,如果用户通过网站更新/更改了他的个人资料,则插入/更新 MsSQL 表。

希望有人能帮帮我。

提前谢谢:)

好的,当我这样做时:

    <?php
    $profile["id"] = "636";
    $profile["name"] = "test2";
    $profile["username"] = "test2";
    $profile["email"] = "test2@test.nl";
    $profile["password"] = "$P$DcH9yo/xVoU7vTXgvmwCrCn5dDwfnE0";
    $profile["password_clear"] = "";
    $profile["block"] = "0";

    foreach ($profile as $key => $value)
    {
      $$key = $value;
    } 

    echo $id;

    ?>

我得到:636(我想要的)

但是当我这样做时:

    <?php
    /* Create Array named $profile with contents of jos_users */
    $user =& JFactory::getUser();
    foreach ($user as $key => $value)
    {
    $$key = $value;
    }

    ?>

我得到一个空白页。我的意思是空白页,我从 Joomla 文章中运行这个 php,整个模板在浏览器中显示为空白。不是因为我没有在第二个脚本中使用回声。

我不明白:/

@Hüseyin BABAL 这里是 var_dump($user);

    object(JUser)#35 (26) { ["isRoot":protected]=> bool(false) ["id"]=> string(3) "636" ["name"]=> string(5) "test2" ["username"]=> string(5) "test2" ["email"]=> string(13) "test2@test.nl" ["password"]=> string(34) "$P$DcH9yo/xVoU7vTXgvmwCrCn5dDwfnE0" ["password_clear"]=> string(0) "" ["block"]=> string(1) "0" ["sendEmail"]=> string(1) "0" ["registerDate"]=> string(19) "2014-04-11 18:49:24" ["lastvisitDate"]=> string(19) "2014-04-12 13:38:55" ["activation"]=> string(0) "" ["params"]=> string(2) "{}" ["groups"]=> array(1) { [2]=> string(1) "2" } ["guest"]=> int(0) ["lastResetTime"]=> string(19) "0000-00-00 00:00:00" ["resetCount"]=> string(1) "0" ["_params":protected]=> object(JRegistry)#36 (1) { ["data":protected]=> object(stdClass)#37 (0) { } } ["_authGroups":protected]=> array(2) { [0]=> int(1) [1]=> int(2) } ["_authLevels":protected]=> array(3) { [0]=> int(1) [1]=> int(1) [2]=> int(2) } ["_authActions":protected]=> NULL ["_errorMsg":protected]=> NULL ["_errors":protected]=> array(0) { } ["aid"]=> int(0) ["otpKey"]=> string(0) "" ["otep"]=> string(0) "" } 

@Hüseyin BABAL 这里是 var_export($user);谢谢:)

    JUser::__set_state(array( 'isRoot' => false, 'id' => '636', 'name' => 'test2', 'username' => 'test2', 'email' => 'test2@test.nl', 'password' => '$P$DcH9yo/xVoU7vTXgvmwCrCn5dDwfnE0', 'password_clear' => '', 'block' => '0', 'sendEmail' => '0', 'registerDate' => '2014-04-11 18:49:24', 'lastvisitDate' => '2014-04-12 17:27:36', 'activation' => '', 'params' => '{}', 'groups' => array ( 2 => '2', ), 'guest' => 0, 'lastResetTime' => '0000-00-00 00:00:00', 'resetCount' => '0', '_params' => JRegistry::__set_state(array( 'data' => stdClass::__set_state(array( )), )), '_authGroups' => array ( 0 => 1, 1 => 2, ), '_authLevels' => array ( 0 => 1, 1 => 1, 2 => 2, ), '_authActions' => NULL, '_errorMsg' => NULL, '_errors' => array ( ), 'aid' => 0, 'otpKey' => '', 'otep' => '', )) 

@Hüseyin BABAL,这是 var_dump(get_object_vars($user)); 的输出

    array(20) { ["id"]=> string(3) "636" ["name"]=> string(5) "test2" ["username"]=> string(5) "test2" ["email"]=> string(13) "test2@test.nlDit e-mailadres wordt beveiligd tegen spambots. JavaScript dient ingeschakeld te zijn om het te bekijken. " ["password"]=> string(34) "$P$DcH9yo/xVoU7vTXgvmwCrCn5dDwfnE0" ["password_clear"]=> string(0) "" ["block"]=> string(1) "0" ["sendEmail"]=> string(1) "0" ["registerDate"]=> string(19) "2014-04-11 18:49:24" ["lastvisitDate"]=> string(19) "2014-04-12 17:50:44" ["activation"]=> string(0) "" ["params"]=> string(2) "{}" ["groups"]=> array(1) { [2]=> string(1) "2" } ["guest"]=> int(0) ["lastResetTime"]=> string(19) "0000-00-00 00:00:00" ["resetCount"]=> string(1) "0" ["_errors"]=> array(0) { } ["aid"]=> int(0) ["otpKey"]=> string(0) "" ["otep"]=> string(0) "" } 

我不得不提到的是,使用这个脚本:

    <?php
    $user =& JFactory::getUser();
    $userArr = (array) $user;
    foreach($userArr as $key => $value) 
    {
    $$key = "$value";
    }
    echo $id;
    ?>

它抛出:500 内部服务器错误?

我刚刚为 Joomla 安装了 full_ajax 插件后收到此弹出消息。

好的,现在我试过了(希望我做得对)

    <?php
    $user =& JFactory::getUser();
    $userArr = get_object_vars($user);
    foreach($userArr as $key => $value)
    {
    $$key = $value;
    }
    echo $id;
    ?>

仍然是 500 内部服务器错误。把回声去掉没关系。

【问题讨论】:

  • 您可以使用可变变量来做到这一点,您可以查看我的答案和演示。
  • 能否请您检查错误日志?如果有 500 错误,则错误日志中必须有错误定义
  • 抱歉拖了这么久,我正在尝试查找 Joomla 应该写入的日志文件。还试图在服务器本身上查找服务器日志。它抛出这个:致命错误:调用 C:\www\xampp\htdocs\super11clean\plugins\content\pagenavigation\pagenavigation.php 中非对象的成员函数 get() 第 44 行
  • 好的,这是插件试图显示文章:第 44 行说: if (($context == 'com_content.article') && ($view == 'article') && $params ->get('show_item_navigation'))
  • 请您尝试禁用该插件

标签: php mysql sql-server joomla


【解决方案1】:

PHP 拥有一个有用的array function,称为extract(),可以完全满足您的需求。它将数组的元素拉入当前符号表(其本身就是一个数组)。

...   
foreach ($resultset as $row)  {
    extract( $row, EXTR_OVERWRITE, 'row_');

    /*now your row elements are in the symbol table with names starting with row_ */

    echo "id = $row_id";
    echo "name = $row_name";
}

【讨论】:

    【解决方案2】:

    你可以用variable variables点赞;

    ......    
    foreach ($profile as $key => $value)
    {
        echo "$$key = \"$value\";\n";
    }
    

    这是一个工作演示:Demo

    编辑:您正在尝试迭代对象。可以使用get_object_vars获取对象属性;

    $userArr = get_object_vars($user);
    foreach($userArr as $key => $value) {....
    

    【讨论】:

    • 首先,感谢您的快速回复!我喜欢这个演示,谢谢 :) 所以 echo "$$key = \"$value\";\n";有诀窍吗??天哪,我花了将近2天的时间。也许我应该有一个新的爱好 :( 让我直截了当地说,额外的 $ 用于创建变量,\n 我还没有得到,但我会用谷歌搜索。重点是,我必须明白它是什么是的。:) 再次感谢!
    • \n 是换行符。您使用了&lt;br&gt;,它仅用于 html 换行,在代码部分中不起作用。它将被打印为文本。我已经使用\n 换行以使变量分配看起来很漂亮。正如您在演示中看到的那样,变量赋值已在单独的行中声明。如果我不使用它,变量赋值将相互附加,你会在一行中看到声明。对于可变变量,$$key 可以解决问题。它认为您不需要进一步解释$$key 部分?
    • 感谢您帮助我 :) 非常感谢 :) 但是,当我这样做时: /* 仅用于调试目的 8*/ foreach ($profile as $key => $value) { echo "$$key = \"$value\";\n"; } 回声“$id”; ?> $id 不返回任何值,这就是我想要做的。在脚本的其余部分重用创建的 $id(应该包含值 636)。我确定我错过了什么,但我似乎无法得到什么:/
    • 这些变量是否存储在内存中?我通常使用的是: $usr_id = $user->get('id');这样,声明的 $usr_id 就存储在内存中,我可以在脚本的其余部分重用该变量。这就是我想要完成的。
    • 在演示中,我只是附和了它。如果你可以使用$$key = $value;,这将是真实的。您可以在代码的下一行中使用该变量
    【解决方案3】:

    我改变了完整的方法并创建了这个:(对我有用,可能不是最好的解决方案,但就像我说的,它有效,我还在学习 PHP)

        <?php
        session_start();
        $user =& JFactory::getUser();
        $session = JFactory::getSession(); //get cuurent session
        $session->set('user', new JUser($user->id)); //update changed profile settings
        //new data for your user after the update
        $user = JFactory::getUser();
    
        $usr_id     = $user->get('id');
        $usr_login  = $user->get('username');
        $usr_name   = $user->get('name');
        $usr_mail   = $user->get('email');
        $guest      = $user->guest;
    
        /*
        echo $guest;
        echo $usr_id;
        echo $usr_login;
        echo $usr_name;
        echo $usr_mail;
        */
    
    // init Joomla Framework
        if ($guest === 0)
        {
            define( 'DS', DIRECTORY_SEPARATOR );
    
            require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
            require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
    
            $mainframe = JFactory::getApplication('site');
    
            // DBQuery
            $database =& JFactory::getDBO();
            $query = "SELECT profile_value FROM #__user_profiles WHERE user_id = '$user->id' AND profile_key LIKE 'testprofile.%'";
            $database->setQuery($query);
            $telnr = $database->loadResult();
    
           print_r($telnr);
    
    
        echo '<br/>';
        echo 'my id is '.$usr_id.' and username is '.$usr_login.' and phonenumber '.$telnr;
    

    ?>

    这会给我需要的结果。

    感谢大家的帮助:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-23
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-22
      相关资源
      最近更新 更多