Почему я до сих пор получаю

Предупреждение: mysql_fetch_assoc () ожидает, что параметр 1 будет ресурсом, строка указана в

При использовании следующей функции :?

public function getRowsWhere($table, $order_by, $where_field, $where_match, $limit_start = 0, $limit_end = 1) {

    // query Table
    $query_string = "SELECT * FROM $table WHERE $where_field='$where_match' ORDER BY '$order_by' DESC LIMIT $limit_start, $limit_end";

    // run query
    $sql    = new DBQuery($this->database);
    $result = $sql->prepareQuery($query_string);

    if ($result) {
       // initialize results array
        $match_array = [];

        // iterate through array and place results in an array at row index
        $r = 0;
        while ($row = mysql_fetch_assoc($result)) {
            $row_array = [];
            $c       = 0;
            while ($c < mysql_num_fields($result)) {
                $col                   = mysql_fetch_field($result, $c);
                $row_array[$col->name] = $row[$col->name];
                $c++;
            }
            $match_array[$r] = $row_array;
            $r++;
        }
    }

    // return data
    return $match_array;
}

Что вызывается из следующего:

if (!$breadcrumbs->getCrumb(2)) {
    $project_details = $copy->getRows('projects', 'id', 'DESC', 0, 1);
}
else {
    $project_details = $copy->getRowsWhere('projects', 'id', 'id', $breadcrumbs->getCrumb(2), 0, 1);
    if (!$project_details) {
        $project_details = $copy->getRows('projects', 'id', 'DESC', 0, 1);
    }
}

По запросу: класс DBQuery. Это все довольно простые вещи.

<?php

class DbQuery extends DbMan {

    /**
     *   PARAMETERS
     *
     * ^ @param array  $database            -> database connection information
     * --------------------------------------------------------------------------
     */
    protected $database;

    /**
     * --------------------------------------------------------------------------
     *   PUBLIC
     *   __construct ()
     * = set database object to use
     *
     * ^ @param string  $database           -> database connection information
     * --------------------------------------------------------------------------
     *
     */
    public function __construct($database) { $this->database = $database; }

    /**
     * --------------------------------------------------------------------------
     *   PUBLIC
     *   prepareQuery ()
     * = checks Sql, executes query to return requested data set
     *
     * ^ @param  string  $query_request     -> query string
     * ~ @return object  $result_dataset    -> result data set
     * --------------------------------------------------------------------------
     *
     */
    public function prepareQuery($query_request) {

        // retrieve result dataset
        $result_dataset = $this->executeQuery($query_request);

        // return result data set
        return $result_dataset;
    }
}

И класс, который он расширяет, DBMan:

<?php
class DbMan {

    /**
     *   PARAMETERS
     *
     * ^ @param array   $database           -> database connection information
     *   @param object  $mysql_connection   -> database connection object
     *   @param object  $mysql_connection   -> database object
     * --------------------------------------------------------------------------
     */
    protected $database;
    private   $mysql_connection;
    private   $mysql_db;

    /**
     * --------------------------------------------------------------------------
     *   PUBLIC
     *   __construct ()
     * = empty constructor
     *
     * ^ @param        ->
     * --------------------------------------------------------------------------
     *
     */
    public function __construct() { }

    /**
     * --------------------------------------------------------------------------
     *   PROTECTED
     *   dbConnect ()
     * = open connection to MySql and connect to database
     *
     * ^ @param        ->
     * --------------------------------------------------------------------------
     *
     */
    protected function dbConnect() {

        // connect to MySQL
        $this->mysql_connection = mysql_connect($this->database['hostname'], $this->database['username'], $this->database['password'])
            or die('Unable to connect to MySQL : ' . mysql_error());

        // connect to database
        $this->mysql_db = mysql_select_db($this->database['database'], $this->mysql_connection)
            or die('Unable to connect to database : ' . mysql_error());
    }

    /**
     * --------------------------------------------------------------------------
     *   PROTECTED
     *   executeQuery ()
     * = run query on database
     *
     * ^ @param  string  $query          -> sql statement string
     * ~ @return result  $query_result   -> result of query
     * --------------------------------------------------------------------------
     *
     */
    protected function executeQuery($query) {

        // open connection to the database
        $this->dbConnect();

        // run sql query on database
        $query_result = mysql_query($query)
            or die('Could not run query on table:<br />' . mysql_error());

        // close database connection
        mysql_close($this->mysql_connection);

        // Check to make sure data is returned
        if (mysql_num_rows($query_result)) {
            // return result data set
            return $query_result;
        }
        else {
            // return nothing
            return "No Data Available";
        }
    }
}

Надеюсь, это проясняет ситуацию ..

-1
obmon 31 Мар 2013 в 15:11
Пожалуйста, не используйте функции mysql_* в новом коде. Они больше не поддерживаются и официально устарели. Видите красную рамку? Вместо этого узнайте о подготовленных операторах и используйте pdo или mysqli.
 – 
hjpotter92
31 Мар 2013 в 15:15
Кажется, вы используете какую-то библиотеку, потому что DBQuery не является обычным классом PHP. Вы должны сообщить об этом более подробно.
 – 
Michael Härtl
31 Мар 2013 в 15:15
А что такое $sql->prepareQuery?
 – 
hjpotter92
31 Мар 2013 в 15:16
Мне кажется, что вы не выполнили запрос. Что делает prepareQuery?
 – 
Havelock
31 Мар 2013 в 15:16
1
Если вы не можете больше рассказать об этом классе, мы ничем вам не поможем. Нам нужна документация, что возвращает метод этого класса prepareQuery().
 – 
Michael Härtl
31 Мар 2013 в 15:19

1 ответ

Лучший ответ

Вы закрываете соединение здесь:

    // close database connection
    mysql_close($this->mysql_connection);

    // Check to make sure data is returned
    if (mysql_num_rows($query_result)) {
        // return result data set
        return $query_result;
    }
    else {
        // return nothing
        return "No Data Available";
    }

Это означает, что mysql_num_rows возвращает FALSE, и поэтому возвращается строка No Data Available, следовательно, возникает ошибка mysql_fetch_assoc() expects parameter 1 to be resource, string given.

0
MichaelRushton 31 Мар 2013 в 15:32
Спасибо. Думаю, сейчас я просто проигнорирую ошибку и перейду с mysql позже.
 – 
obmon
31 Мар 2013 в 16:26