sql >> Database >  >> RDS >> Mysql

Kan het aantal rijen niet ophalen en ophalen bij gebruik van een door MySQLi voorbereide instructie

Als u mysqli_stmt::$num_rows . wilt gebruiken (dat wil zeggen, controleer het aantal rijen op de voorbereide instructie), u moet $stmt->store_result() gebruiken na het uitvoeren van de voorbereide instructie voordat u het aantal rijen kunt controleren. Dat betekent dat het resultaat in het geheugen wordt opgeslagen voordat we controleren hoeveel rijen zijn geretourneerd.

$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) {
    // ...

Als u echter mysqli_result::$num_rows . wilt gebruiken (op het MySQLi-resultaat dat u converteert van het resultaat van de instructie), moet u dat doen nadat u $result = $stmt->get_result(); hebt gedaan , en gebruik $result->num_rows; , zoals hieronder weergegeven.

$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()) {
    // ....

Uiteindelijk zouden ze allebei hetzelfde moeten doen:geef een aantal van de rijen op die zijn geretourneerd door de oorspronkelijke voorbereide query.

Opmerking
Het is belangrijk op te merken dat u store_result() niet kunt gebruiken en get_result() op dezelfde verklaring. Wat betekent dat je in het eerste voorbeeld niet kunt converteren naar een mysqli-result-object (met behulp van get_result() , waarmee u de standaard fetch_assoc() . kunt gebruiken methode). Als store_result() slaat het resultaat op in het geheugen, er zijn niets voor get_result() om te zetten, en omgekeerd.

Dit betekent dat als u store_result() . gebruikt , moet u de instructie ophalen, mysqli_stmt::fetch() en bind de resultaten via mysqli_stmt::bind_result() . Als u get_result() . gebruikt , moet u het aantal rijen op het resulterende MySQLi-resultaatobject controleren (zoals weergegeven in het tweede voorbeeld).

U moet uw code daarom zo construeren dat u er maar één hoeft te gebruiken.

Dat gezegd hebbende, gebruik affected_rows zoals gesuggereerd in de opmerkingen, is niet de juiste tool voor de klus - volgens de handleiding op mysqli_stmt::$affected_rows (hetzelfde geldt voor een gewone zoekopdracht, mysqli::$affected_rows ):




  1. Is het mogelijk om de natuurlijke volgorde van kolommen in Postgres te wijzigen?

  2. Converteer 'smalldatetime' naar 'datetime' in SQL Server (T-SQL-voorbeelden)

  3. Hoe een mysql-opgeslagen procedure aanroepen, met argumenten, vanaf de opdrachtregel?

  4. Kan object van het type PDOStatement niet gebruiken als array