sql >> Databáze >  >> RDS >> Mysql

Nelze získat počet řádků a načíst při použití připraveného příkazu MySQLi

Pokud chcete použít mysqli_stmt::$num_rows (to znamená zkontrolovat počet řádků na připraveném výpisu), musíte použít $stmt->store_result() po provedení připraveného příkazu, než bude možné zkontrolovat počet řádků. To znamená, že výsledek se uloží do paměti, než zkontrolujeme, kolik řádků bylo vráceno.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$stmt->store_result(); // Need to store the result into memory first
if ($stmt->num_rows) {
    // ...

Pokud však chcete použít mysqli_result::$num_rows (na výsledku MySQLi, který převedete z výsledku příkazu), to musíte udělat po provedení $result = $stmt->get_result(); a použijte $result->num_rows; , jak je znázorněno níže.

$stmt = $conn->prepare($sql);
$stmt->bind_param('ss',$log_username,$log_username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows) {
    while ($row = $result->fetch_assoc()) {
    // ....

Nakonec by oba měli udělat totéž – poskytnout počet řádků vrácených původně připraveným dotazem.

Poznámka
Je důležité si uvědomit, že nemůžete použít store_result() a get_result() na stejném prohlášení. Což znamená, že v prvním příkladu nemůžete převést na objekt mysqli-result (pomocí get_result() , který vám umožňuje použít standardní fetch_assoc() metoda). Jako store_result() uloží výsledek do paměti, není zde nic pro get_result() převádět a naopak.

To znamená, že pokud použijete store_result() , musíte načíst pomocí příkazu-fetch, mysqli_stmt::fetch() a svázat výsledky pomocí mysqli_stmt::bind_result() . Pokud použijete get_result() , měli byste zkontrolovat počet řádků na výsledném objektu MySQLi-result (jak ukazuje druhý příklad).

Měli byste proto sestavit svůj kód tak, že potřebujete použít pouze jeden z nich.

Jak již bylo řečeno, pomocí affected_rows jak bylo navrženo v komentářích, není to správný nástroj pro tuto práci - podle manuálu na mysqli_stmt::$affected_rows (totéž platí pro běžný dotaz, mysqli::$affected_rows ):




  1. MySQL LIKE dotaz s podtržítkem

  2. Laravel a InnoDB

  3. Jako operátor v Entity Framework?

  4. Vnitřní spojení se 3 tabulkami v mysql