我已经在MySQL的PHP​​ / PDO问题上停留了几天,而我只是想不出为什么它返回一个空数组...

我收到的错误消息如下所示:


  注意:未定义的偏移量:第24行的/home/saxon/students/20141/jolf14/www/oophp/kmom04/webroot/sqltest3.php中为0
  
  注意:尝试在第24行的/home/saxon/students/20141/jolf14/www/oophp/kmom04/webroot/sqltest3.php中获取非对象的属性


第一类看起来像这样:

<?php

/**
 * ctMovies is a class that handles movies and database
 *
 */
class ctMovies{

   /**
   * Constructor
   *
   */
   public function __construct() {

    }



 /**
 * Use the current querystring as base, modify it according to $options and return the modified query string.
 *
 * @param array $options to set/change.
 * @param string $prepend this to the resulting query string
 * @return string with an updated query string.
 */
function getQueryString($options = array(), $prepend = '?') {
    // parse query string into array
    $query = array();
    parse_str($_SERVER['QUERY_STRING'], $query);

    // Modify the existing query string with new options
    $query = array_merge($query, $options);

    // Return the modified querystring
    return $prepend . htmlentities(http_build_query($query));
}

/**
 * Create links for hits per page.
 *
 * @param array $hits a list of hits-options to display.
 * @param array $current value.
 * @return string as a link to this page.
 */
function getHitsPerPage($hits, $current = null) {
    $nav = "Träffar per sida: ";
    foreach ($hits AS $val) {
        if ($current == $val) {
            $nav .= "$val ";
        } else {
            $nav .= "<a href='" . $this->getQueryString(array('hits' => $val)) . "'>$val</a> ";
        }
    }
    return $nav;
}

/**
 * Create navigation among pages.
 *
 * @param integer $hits per page.
 * @param integer $page current page.
 * @param integer $max number of pages.
 * @param integer $min is the first page number, usually 0 or 1.
 * @return string as a link to this page.
 */
function getPageNavigation($hits, $page, $max, $min = 1) {
    $nav = ($page != $min) ? "<a href='".$this->getQueryString(array('page' => $min))."'>&lt;&lt;</a>" : '&lt;&lt;';
    $nav .= ($page > $min) ? "<a href='".$this->getQueryString(array('page' => ($page > $min ? $page - 1 : $min)))."'>&lt;</a>" : '&lt;';

    for ($i = $min; $i <= $max; $i++) {
        if ($page == $i) {
            $nav .= "$i ";
        } else {
            $nav .= "<a href='".$this->getQueryString(array('page' => $i)) ."'>$i</a> ";
        }
    }

    $nav .= ($page < $max) ? "<a href='".$this->getQueryString(array('page' => ($page < $max ? $page + 1 : $max)))."'>&gt;</a>" : '&gt;';
    $nav .= ($page != $max) ? "<a href='".$this->getQueryString(array('page' => $max))."'>&gt;&gt;</a> " : '&gt;&gt; ';
    return $nav;
}

/**
 * Function to create links for sorting
 *
 * @param string $column the name of the database column to sort by
 * @return string with links to order by column.
 */
function orderby($column) {
    $nav = "<a href='" . $this->getQueryString(array('orderby' => $column, 'order' => 'asc')) . "'>&darr;</a>";
    $nav .= "<a href='" . $this->getQueryString(array('orderby' => $column, 'order' => 'desc')) . "'>&uarr;</a>";
    return "<span class='orderby'>" .$nav . "</span>";
}

}


扩展第一类的第二个类如下所示:

<?php

/**
 * cMovies is a class that handles movies and database
 *
 */
class cMovies extends ctMovies {
   /**
   * Properties
   *
   */
    private $db;
    private $sqlOrig;
    private $where;
    private $groupby;
    private $params;

   /**
   * Constructor
   *
   */
   public function __construct($db) {
       parent::__construct();
     $this->db=$db;
    }




/**
 * Function to get movie table
 *
 */
function getTable(){
// Get parameters
$title = htmlentities(isset($_GET['title']) ? $_GET['title'] : null);
$title=  str_replace('*', '%', $title);
$hits = isset($_GET['hits']) ? $_GET['hits'] : 8;
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$year1 = isset($_GET['year1']) && !empty($_GET['year1']) ? $_GET['year1'] : null;
$year2 = isset($_GET['year2']) && !empty($_GET['year2']) ? $_GET['year2'] : null;
$orderby = isset($_GET['orderby']) ? strtolower($_GET['orderby']) : 'id';
$order = isset($_GET['order']) ? strtolower($_GET['order']) : 'asc';


// Check that incoming parameters are valid
is_numeric($hits) or die('Check: Hits must be numeric.');
is_numeric($page) or die('Check: Page must be numeric.');
is_numeric($year1) || !isset($year1) or die('Check: Year must be numeric or not set.');
is_numeric($year2) || !isset($year2) or die('Check: Year must be numeric or not set.');

// Prepare the query based on incoming arguments
$this->sqlOrig = '
  SELECT
    M.*,
    GROUP_CONCAT(G.name) AS genre
  FROM Movie AS M
    LEFT OUTER JOIN Movie2Genre AS M2G
      ON M.id = M2G.idMovie
    INNER JOIN Genre AS G
      ON M2G.idGenre = G.id
';
$this->where = null;
$this->groupby = ' GROUP BY M.id';
$limit = null;
$sort = " ORDER BY $orderby $order";
$this->params= array();


// Select by title
if ($title) {
    $this->where .= ' AND title LIKE ?';
    $this->params[] = $title;
}

// Select by year
if ($year1) {
   $this->where .= ' AND year >= ?';
    $this->params[] = $year1;
}
if ($year2) {
    $this->where .= ' AND year <= ?';
    $this->params[] = $year2;
}

// Pagination
if ($hits && $page) {
    $limit = " LIMIT $hits OFFSET " . (($page - 1) * $hits);
}


// Complete the sql statement
$this->where = $this->where ? "WHERE 1 {$this->where}" : null;
$sql = $this->sqlOrig . $this->where . $this->groupby . $sort . $limit;
$res = $this->db->ExecuteSelectQueryAndFetchAll($sql, $this->params);


//// Put results into a HTML-table
$tr = "<tr><th>Rad</th><th>Id " . $this->orderby('id') . "</th><th>Bild</th><th>Titel " . $this->orderby('title') . "</th><th>År " . $this->orderby('year') . "</th><th>Genre</th></tr>";
foreach ($res AS $key => $val) {
    $tr .= "<tr><td>{$key}</td><td>{$val->id}</td><td><img width='80' height='40' src='{$val->image}' alt='{$val->title}' /></td><td>{$val->title}</td><td>{$val->YEAR}</td><td>{$val->genre}</td></tr>";
}
return $tr;
}
/**
 * Function to get a result which can be used to calculate maximal number
 * of pages.
 */
function getResMaxPages() {
//// Get max pages for current query, for navigation
$sql = 'SELECT COUNT(id) AS rows FROM ($this->sqlOrig $this->where $this->groupby) AS Movie';
echo "$this->sqlOrig";
echo "$this->where";
echo "$this->groupby";
$res = $this->db->ExecuteSelectQueryAndFetchAll($sql, $this->params);
return $res;
}
}


这一切都由这个小家伙负责:

<?php

/**
 * This is a joax pagecontroller.
 * It handles movie information from a database
 */
// Include the essential config-file which also creates the $joax variable with its defaults.
include(__DIR__ . '/config.php');

$joax['stylesheets'][] = 'css/table.css';


// Connect to a MySQL database using PHP PDO
$db = new cDatabase($joax['database']);
$movies = new cMovies($db);

$tr=$movies->getTable();
$hits = isset($_GET['hits']) ? $_GET['hits'] : 8;
$page = isset($_GET['page']) ? $_GET['page'] : 1;
$title = htmlentities(isset($_GET['title']) ? $_GET['title'] : null);
$year1 = isset($_GET['year1']) && !empty($_GET['year1']) ? $_GET['year1'] : null;
$year2 = isset($_GET['year2']) && !empty($_GET['year2']) ? $_GET['year2'] : null;
$res=$movies->getResMaxPages();
$rows = $res[0]->rows;
$max = ceil($rows / $hits);
// Do it and store it all in variables in the joax container.
$joax['title'] = "Visa filmer med olika sökalternativ";

$hitsPerPage =  $movies->getHitsPerPage(array(2, 4, 8), $hits);
$navigatePage = $movies->getPageNavigation($hits, $page, $max);
//$sqlDebug = $db->Dump();

$joax['main'] = <<<EOD
<h1>{$joax['title']}</h1>

<form>
  <fieldset>
  <legend>Sök</legend>
  <input type=hidden name=hits value='{$hits}'/>
  <input type=hidden name=page value='1'/>
  <p><label>Titel (delsträng, använd * eller % ): <input type='search' name='title' value='{$title}'/></label></p>
  <p><label>Skapad mellan åren:
      <input type='text' name='year1' value='{$year1}'/></label>
      -
      <input type='text' name='year2' value='{$year2}'/>

  </p>
  <p><input type='submit' name='submit' value='Sök'/></p>
  <p><a href='?'>Visa alla</a></p>
  </fieldset>
</form>

<div>
  <div>{$rows} träffar. {$hitsPerPage}</div>
  <table>
  {$tr}
  </table>
  <div class='center'>{$navigatePage}</div>
</div>

EOD;

// Finally, leave it all to the rendering phase of joax.
include(JOAX_THEME_PATH);


我也有一个类来处理数据库,但是它工作正常,我也可以发布它,但是我没有收到任何错误,并且可以从数据库中加载文件。

最佳答案

未定义的偏移量:0表示您引用的数组键不存在。尝试获取非对象的属性支持此操作,并且很可能在sqltest3.php的第24行引用该对象之前未能正确实例化该对象,如果您不发布代码,那么我将无法为您提供帮助该文件。在引用对象之前,您可能需要执行以下操作:

$some_variable = new whatever_class_is_on_line_24_of_sqltest3_dot_php();

09-25 22:23