【问题标题】:Get data from mysql db using a variable使用变量从 mysql db 获取数据
【发布时间】:2018-08-09 22:13:53
【问题描述】:

我正在尝试使用一个对象从 mysql 数据库中获取数据,该对象实际上是一个变量:

try {
$mysqlcon = new PDO($dbserver, $db['user'], $db['pass'], $dboptions);
// Selecting database "user" to get data about a specific client
if(($user_data = $mysqlcon->query("SELECT * FROM $dbname.user;")->fetchAll(PDO::FETCH_UNIQUE|PDO::FETCH_ASSOC)) === false)
{
    echo '$#!+ happens, Critical DataBase Error!';// error on db select
}

echo 'Country: '.$user_data[$clientuid]['nation']; // This is not working, it gives nothing
echo 'Country: '.$user_data['OISnyJzyjA63XkPB6xla8hjms3M=']['nation']; // BUT This works perfectly               
// DEBUGGING
echo $clientuid; // it outputs: OISnyJzyjA63XkPB6xla8hjms3M=
var_dump($clientuid); // and this is the important thing, it outputs this: object(TeamSpeak3_Helper_String)#27 (2) { ["string":protected]=> string(28) "OISnyJzyjA63XkPB6xla8hjms3M=" ["position":protected]=> int(0) }
}
catch (PDOException $e)
{
    echo "Database Connection failed: ".$e->getMessage()."\n";
    exit;
}

echo $clientuid; 输出:OISnyJzyjA63XkPB6xla8hjms3M=

这是行不通的,它什么也没提供:

echo 'Country: '.$user_data[$clientuid]['nation'];

这很好用:

echo 'Country: '.$user_data['OISnyJzyjA63XkPB6xla8hjms3M=']['nation'];                

var_dump($clientuid); 产生这个:

object(TeamSpeak3_Helper_String)#27 (2) {
    ["string":protected]=> string(28) "OISnyJzyjA63XkPB6xla8hjms3M=" 
    ["position":protected]=> int(0)
}

【问题讨论】:

  • 好吧,祝你好运。你有问题吗?
  • $user_data[$clientuid]['nation']; // This is not working, it gives nothing - 它应该给你一个警告。

标签: php mysql string variables protected


【解决方案1】:

$user_data 是一个对象,有一个protected 字符串属性,显然是一个神奇的__tostring() 方法,当对象作为字符串访问时返回字符串属性(如echo)。如果没有 __tostring() 方法,你会得到:

可恢复的致命错误:无法将 TeamSpeak3_Helper_String 类的对象转换为字符串

如果字符串属性是public,那么你可以访问它:

echo 'Country: '.$user_data[$clientuid->string]['nation'];

但它是 protected 并且无法访问,您会得到:

致命错误:未捕获的错误:无法访问受保护的属性 TeamSpeak3_Helper_String::$string

当用作数组索引时,它不会强制字符串,因此要强制它触发 __tostring() 魔术方法,强制转换为 (string) 将起作用(尽管可能有几种方法可以做到):

echo 'Country: '.$user_data[(string)$clientuid]['nation'];

或者使用引号:

echo 'Country: '.$user_data["$clientuid"]['nation'];

【讨论】:

    【解决方案2】:

    $clientuid 是一个对象,而不是简单的字符串值,首先从 $clientuid 获取值到一个变量中,然后使用该变量。

    我没有使用过 TeamSpeak3_Helper_String 对象,但经过一番搜索,我发现一些可能你应该先使用 __toString() 方法将其转换为字符串。

    参考以下链接,这些可能会有所帮助

    https://hotexamples.com/examples/-/TeamSpeak3_Helper_String/-/php-teamspeak3_helper_string-class-examples.html

    https://docs.planetteamspeak.com/ts3/php/framework/class_team_speak3___helper___string.html#a5558c5d549f41597377fa1ea8a1cefa3

    【讨论】:

      猜你喜欢
      • 2021-04-16
      • 2020-06-02
      • 1970-01-01
      • 2016-06-15
      • 2014-05-07
      • 1970-01-01
      • 2021-11-06
      • 2014-12-25
      • 2018-03-17
      相关资源
      最近更新 更多