所以我正在研究PHP,因此我了解了 __ call()方法,因为它调用了未知方法,因此我将方法 name 称为它是我的数据库的表名,因为我想从数据库访问所有序列号(sn)并使用此方法在屏幕上打印。我知道我的代码中存在很大的错误而且我没有得到它,我很惊讶。请帮忙! 如果你没有明白我的意思那么请问,我会解释一下!
我实际上想要从这个脚本中获取的是我希望使用__call()方法从数据库访问,并使用var_dump()从数据库中获取数据,就像我在这里一样,
public function getOne($table_name) {
$rss= mysqli_query(self::$connection,"SELECT * FROM $table_name LIMIT 1");
return mysqli_fetch_assoc($rss);
}
这里我直接从数据库获取所有数据并在屏幕上回显,但是使用__call()我也想做同样但有行。我怎样才能做到这一点? 另外__call()的实际用途是什么?
class mysql_db {
private static $instance;
public static $connection;
public function __construct($host=null, $user=null, $password=null, $db=null) {
if(!self::$instance && !$host) {
throw new \Exception("Missing Database..!!!");
}
self::$connection = mysqli_connect($host,$user,$password,$db);
}
public function __destruct() {
mysqli_close(self::$connection);
}
public function getData($table_name) {
$rs= mysqli_query(self::$connection,"SELECT * FROM $table_name");
return mysqli_fetch_all($rs,MYSQLI_ASSOC);
}
public function getOne($table_name) {
$rss= mysqli_query(self::$connection,"SELECT * FROM $table_name LIMIT 1");
return mysqli_fetch_assoc($rss);
}
public function find($table_name,$sn,$val) {
$rq= mysqli_query(self::$connection,"SELECT * FROM $table_name WHERE $sn='$val'");
return mysqli_fetch_all($rq,MYSQLI_ASSOC);
}
**// I AM GETTING ERROR FROM THESE LINES**
//-> public function __call($table_name,$sn) {
//-> //var_dump("SELECT * FROM $table_name where sn='1'");
//-> $rt= mysqli_query(self::$connection,"SELECT * FROM $table_name
WHERE '$sn'")or die(mysqli_error()) ;
//-> return mysqli_fetch_all($rt,MYSQLI_ASSOC);
}
public static function getInstance() {
try {
if(!self::$instance) {
self::$instance=new static('localhost','root','','xam');
}
} catch(\Exception $e) {
echo 'Caught Error: ', $e->getMessage(), "\n";
}
return self::$instance;
}
}
$h= mysql_db::getInstance();
var_dump($h->name("1"));
答案 0 :(得分:1)
__call()
方法是php魔术方法之一。
正如文件中所述:
在与属性交互时调用重载方法 或者尚未声明或在其中不可见的方法 当前范围
关于__call()
魔法:
在对象上下文中调用不可访问的方法时,会触发__ call( string $ name, array $ arguments)。
为什么你的代码无效?
错误消息指出您正在尝试将数组转换为字符串。因此,您传递给$sn
方法的变量__call()
可能不是数组。
此外,您还没有正确连接字符串。如果要在字符串中注入变量。正确的术语是字符串插值,它应该如下实现:
echo "Variables should always be inside brackets. My {$name} is!"
另外,请记住清理您的查询以避免sql注入!检查此answer