2015-05-28 50 views
0

在過去的幾天裏,我一直在撞着一堵相當堅硬的牆壁,試圖去抓住mysqli_result :: fetch_object()

我想要做的是基於包含我需要操作的方法的預先寫好的類實例化一個對象數組。 夠簡單嗎?當然,直到我嘗試將構造函數參數傳遞給每個對象。

,如下面所示現在傳遞參數給類的構造函數中的一個實例正常工作:

<?php 

class classA { 

    private $dbo; 

    function __construct() { 
    $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306); 
    } 

    public function createObject() { 
    $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` = 'value';"); 
    return $stmt->fetch_object('classB', array("A Parameter!")); 
    } 

} 

class classB { 
    private $param; 

    function __construct($param) { 
    $this->param = $param; 
    } 

    public function getParam() { 
    return $this->param; 
    } 

} 

$classA = new classA(); 
echo $classA->createObject()->getParam(); //Returns "A Parameter!" 
?> 

但是如果我要試試這結果是相同的參數會返回「集合」或null,如下例所示:

<?php 

class classA { 

    private $dbo; 

    function __construct() { 
    $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306); 
    } 

    public function createObjects() { 
    $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';"); 
    $myObjects = array(); 

    foreach($stmt as $result) { 
    $myObjects[] = $result->fetch_object("classB", array("A Parameter!")); 
    } 

    return $myObjects; 
    } 

} 

class classB { 
    private $param; 

    function __construct($param) { 
    $this->param = $param; 
    } 

    public function getParam() { 
    return $this->param; 
    } 

} 

$classA = new classA(); 
$i = 0; 
foreach($classA->createObjects() as $anObject) { 
    echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns nothing? 
    $i ++; 
} 
?> 

至少,這是它在我的機器上的表現。

現在對於問題: 這是一個實際的問題mysqli_result :: fetch_object()或是它的設計?

無論哪種方式是否有辦法達到類似的預期效果?

基本上我已經編寫了一系列類,這些類現在取決於這個「錯」,我有其他方法繞過它,但它們不太理想,我寧願被挑戰並學習一些東西。

謝謝你的時間。

UPDATE: 這是非常有可能的,我有我寫的循環錯誤,我只是測試:

<?php 

class classA { 

    private $dbo; 

    function __construct() { 
    $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306); 
    } 

    public function createObjects() { 
    $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';"); 
    $myObjects = array(); 

    if($result = $this->dbo->query("SELECT `column` FROM `table`;")) { 
    while($row = $result->fetch_object("classB", array("A Parameter!"))) { 
    $myObjects[] = $row; 
    } 
    } 

    return $myObjects; 
    } 

} 

?> 

,看來我得到一個結果,我將更加深入明天進行測試。

+1

你沒有使用'extends' – 0yeoj

+0

'extends'在這個例子中是不需要的,因爲我沒有擴展任何類,而是使用一個來創建另一個類。 – TerryP

+0

感謝您的評論,儘管 – TerryP

回答

0

OK事實證明我只是一個傻子,上面提到的循環是不正確的。

這裏是全工作例如:

<?php 

class classA { 

    private $dbo; 

    function __construct() { 
    $this->dbo = new mysqli('127.0.0.1', 'user', 'pass', 'dbName', 3306); 
    } 

    public function createObjects() { 
    $stmt = $this->dbo->query("SELECT `column` FROM `table` WHERE `column` LIKE '%value%';"); 
    $myObjects = array(); 

    if($result = $this->dbo->query("SELECT `column` FROM `table`;")) { 
    while($row = $result->fetch_object("classB", array("A Parameter!"))) { 
    $myObjects[] = $row; 
    } 
    } 
    return $myObjects; 
    } 

} 

class classB { 
    private $param; 

    function __construct($param) { 
    $this->param = $param; 
    } 

    public function getParam() { 
    return $this->param; 
    } 

} 

$classA = new classA(); 
$i = 0; 
foreach($classA->createObjects() as $anObject) { 
    echo "object[{$i}]:'{$anObject->getParam()}'<br />"; //Returns "object[x]:'A Parameter!'<br />" 
    $i ++; 
} 
?> 

再次感謝您的時間。

相關問題