подсчет строк и передача информации с помощью mysqli

Я пытался преобразовать php-страницу в mysqli и столкнулся с некоторыми проблемами. Учитывая приведенный ниже код и то, как я приказал, чтобы все работало, я хотел бы знать, как лучше использовать методы mysqli.

Есть ли альтернатива mysqli mysql_num_rows или другой метод расчета количества требуемых строк?

Как мне сделать следующее, используя mysqli ?:

$data = mysql_query($countQuery) or die(mysql_error());
$rowcount = mysql_num_rows($data);

Какая альтернатива mysql_fetch_assoc? Я чувствую, что мне не следует использовать метод текущих строк, который я использую, даже если есть функция замены, так каков будет правильный подход?

Прошу прощения за эти вопросы, но я пока не смог сам определить ответы.

<?php
$con = mysqli_connect("localhost", "user", "", "ebay");
if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}
$con->query("SET NAMES 'utf8'");
$cmd = "word";
//normally retrieved from GET
if($cmd=="deleterec") {
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    if ($delRecord = $con->prepare($deleteQuery)) {
        $delRecord->bind_param("s", $pk);
        $delRecord->execute();
    }
}
$table = 'AUCTIONS';
$brand = "test";
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";
if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));
    $rowcount = mysql_num_rows($data);
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}
$self = htmlspecialchars($_SERVER['PHP_SELF'],ENT_QUOTES,'utf-8');
foreach ($rows as $row) // print table rows {
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="doThings(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    // repeated for each column
}
function getRowsByArticleSearch($searchString, $table, $max) {
    global $con;
    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM ? WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("ss", $searchString, $table);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
            $result = $con->query($recordsQuery);
            $rows = array();
            while($row = mysql_fetch_assoc($result)) {
                $rows[] = $row;
            }
            return $rows;
        }
    }
}

Ответов (4)

Решение

Я переписал ваш образец кода, добавив в него правильные вызовы свойств / функций, чтобы исправить две проблемы, о которых вы упомянули в вопросе:

<?php
$con = mysqli::connect("localhost", "user", "", "ebay");

if (!$con) {
    echo "Can't connect to MySQL Server. Errorcode: %s\n". mysqli_connect_error();
    exit;
}

$con->query("SET NAMES 'utf8'");
$cmd = "word";

//normally retrieved from GET
if($cmd=="deleterec") {
    $deleteQuery = "DELETE FROM AUCTIONS1 WHERE ARTICLE_NO = ?";
    if ($delRecord = $con->prepare($deleteQuery)) {
        $delRecord->bind_param("s", $pk);
        $delRecord->execute();
    }
}

$table = 'AUCTIONS';
$brand = "test";
$countQuery = "SELECT ARTICLE_NO FROM ? WHERE upper(ARTICLE_NAME) LIKE '% ? %'";

if ($numRecords = $con->prepare($countQuery)) {
    $numRecords->bind_param("ss", $table, $brand);
    $numRecords->execute();
    $data = $con->query($countQuery) or die(print_r($con->error));

    // Here is the property that you can reference to determine the affected rows from the previous query. -- gabriel
    $rowcount = $data->num_rows; 
    $rows = getRowsByArticleSearch($query, $table, $max);
    $last = ceil($rowcount/$page_rows);
}

$self = htmlspecialchars($_SERVER['PHP_SELF'],ENT_QUOTES,'utf-8');

foreach ($rows as $row) // print table rows {
    echo '<tr>' . "\n";
    echo '<td><a href="#" onclick="doThings(\'Layer2\', \'' . $pk . '\')">'.$row['USERNAME'].'</a></td>' . "\n";
    // repeated for each column
}

function getRowsByArticleSearch($searchString, $table, $max) {
    //global $con; Globals are BAD!! Please don't use.
    $con = mysqli::connet("localhost", "user", "", "ebay");

    $recordsQuery = "SELECT ARTICLE_NO, USERNAME, ACCESSSTARTS, ARTICLE_NAME, date_format(str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s'), '%d %m %Y' ) AS shortDate FROM ? WHERE upper(ARTICLE_NAME) LIKE '%?%' ORDER BY str_to_date(ACCESSSTARTS, '%d/%m/%Y %k:%i:%s')" . $max;
    if ($getRecords = $con->prepare($recordsQuery)) {
        $getRecords->bind_param("ss", $searchString, $table);
        $getRecords->execute();
        $getRecords->bind_result($ARTICLE_NO, $USERNAME, $ACCESSSTARTS, $ARTICLE_NAME, $shortDate);
        while ($getRecords->fetch()) {
                $result = $con->query($recordsQuery);
                $rows = array();

                // Notice the adjusted function call to retrieve the associate array for each record within the result set. -- gabriel
                while($row = $result->fetch_assoc()) {
                        $rows[] = $row;
                }
                return $rows;
        }
    }
}

However, I would like to add that dusoft was correct in the assessment that MySQLi is buggy and is known to create issues. It is for this reason that we had to switch from MySQLi to PDO (which is native to PHP as of at least 5.1) and we haven't had any problems since. I would strongly recommend that you look at PDO or perhaps one of the Pear libraries to actually provide your database connection interface.

Обычно я использую это сразу после выполнения:

 $query->execute();
 // store the result first
 $query->store_result();
 $rows = $query->num_rows;

Вы можете использовать:

$data->num_rows();
$data->fetch_assoc();

Вы можете проверить документацию для получения дополнительной информации num_rows и fetch_assoc .

Собственно, чтобы ответить на первый вопрос:

$data = mysql_query($countQuery) or die(mysql_error());
$rowcount = mysql_num_rows($data);

Если вы хотите сделать это с помощью mysqli, mysqli_num_rows отлично подойдет. Единственная разница в том, что не забудьте указать параметр подключения в запросе.

$data = mysqli_query($dbc,$countQuery) or die(mysql_error());