【问题标题】:PHP class providing empty object提供空对象的 PHP 类
【发布时间】:2016-04-15 12:47:29
【问题描述】:

我的 index.php 页面有这段代码,默认用户访问主页。

<?php 
require_once ( "config.php" );
$action = isset( $_GET['action'] ) ? $_GET['action'] : "";
switch ( $action ) {
  case 'seeAll':
    seeAll();
    break;
  case 'viewResource':
    viewResource();
    break;
  default:
    homepage();
}

function homepage() {
  $results = array();
  $learnData = Resource::getHomePageTiles( 'learn' );
  $practiceData = Resource::getHomePageTiles( 'practice' );
  $elseData = Resource::getHomePageTiles( 'else' );
  $results['learn'] = $learnData;
  $results['practice'] = $practiceData;
  $results['else'] = $elseData;
  $results['pageTitle'] = "Couch To Code";
  require_once ( "templates/homepage.php" );
}

它调用了我的 Resource 类的 getHomePageTiles 方法。 这是 Resource 类和 getHomePageTiles 方法的代码。

class Resource {
  public $id = null;
  public $title = null;
  public $summary= null;
  public $url = null;
  public $content = null;
  public $category = null;
  public $is_free = null; //????
  public $is_featured = null;
  public $is_favorite = null;
  public $date_created = null;

  public function __construct( $data ) {
    if ( isset ( $data['id'] ) ) $this->id = (int) $data['id'];
    if ( isset ( $data['title'] ) ) $this->title = $data['title'];
    if ( isset ( $data['summary'] ) ) $this->summary = $data['summary'];
    if ( isset ( $data['url'] ) ) $this->url = $data['url'];
    if ( isset ( $data['content'] ) ) $this->content = $data['content'];
    if ( isset ( $data['category'] ) ) $this->category = $data['category'];
    if ( isset ( $data['is_free'] ) ) $this->is_free = (int) $data['is_free'];
    if ( isset ( $data['is_featured'] ) ) $this->is_featured = (int) $data['is_featured'];
    if ( isset ( $data['is_favorite'] ) ) $this->is_favorite = (int) $data['is_favorite'];
    if ( isset ( $data['date_created'] ) ) $this->date_created = date("Y-m-d H:i:s");
}

public static function getHomePageTiles( $type ) {
  global $DB_HOST;
  global $DB_NAME;
  global $DB_USERNAME;
  global $DB_PASSWORD;
  $conn = new mysqli( $DB_HOST, $DB_USERNAME, $DB_PASSWORD, $DB_NAME );
  if (mysqli_connect_errno()) {
    printf("Connection to the database failed: %s/n", $mysqli -> connect_error);
    exit();
  }
  $sql = "SELECT * FROM resources WHERE category = ? ORDER BY position ASC LIMIT 4;";
  if ($st = $conn->prepare( $sql )) {
    $st->bind_param( "s", $type );
    $st->execute();
    $list = array();
    while ( $row = $st->fetch() ) {
        $resource = new Resource( $row );
        $list[] = $resource;
    }
    $conn = null;
    return $list;
  } else {
    printf("Errormessage: %s\n", $conn->error);
  }
}

我的 Homepage.php 文件中包含以下代码

<?php 
    foreach ( $results['learn'] as $learnTile ) { 
    print_r($learnTile);
?>
    <div class="col-md-3 col-xs-6 featured">

        <a href=".?action=viewResource&amp;resourceId= <?php echo($learnTile->id)?> ">
        <img src="#" class="thumbnail img-responsive">
        </a>
    </div>
<?php } ?>

代码正在提取正确数量的 Resource 对象,但出现了问题,因为我的链接(在 homepage.php 中)没有从 Resource 对象中提取 id。

所以,为了调试,我打印出 ($learnTile) 并得到空对象/数组。

 Resource Object ( [id] => [title] => [summary] => [url] => [content] => [category] => [is_free] => [is_featured] => [is_favorite] => [date_created] => )  Resource Object ( [id] => [title] => [summary] => [url] => [content] ...

我哪里错了?我的构造函数不工作吗?显然,Resource 对象将原始属性定义中的 null 值拉为 null。 我已经为此困扰了几天,因此感谢您提供任何帮助/指导。谢谢!

【问题讨论】:

  • 您是从 Resource 类内部创建一个新资源吗? “$resource = 新资源($row);”这对我来说似乎是错误的。
  • 摆脱全局变量。代码面向对象我的朋友;)
  • 你在获取之前缺少$st-&gt;bind_result(...
  • while ( $row = $st-&gt;fetch() ) { 更改为while ( $row = $st-&gt;fetch_row() ) {

标签: php mysql


【解决方案1】:

$row 中从来没有数组。请参阅手册:php.net/manual/en/mysqli-stmt.fetch.php 它仅返回布尔值。使用 prepare 时应该绑定结果。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2015-02-22
  • 1970-01-01
  • 1970-01-01
  • 2019-07-25
  • 2017-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多