---
title: "Fel i databasklass"
type: "forum-thread"
url: "https://www.webforum.nu/amne/php/192787-fel-i-databasklass"
topic: "PHP"
topic_url: "https://www.webforum.nu/amne/php"
author: "Jester73"
published: "2015-09-30T22:21:41.000Z"
updated: "2015-10-06T10:50:29.000Z"
replies: 10
views: 1370
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/php/192787-fel-i-databasklass"
---

# Fel i databasklass

## #1 — Jester73, 2015-09-30T22:21Z

Hej

Varför får jag ett 1064 fel från MySQL DB på denna kod

```php
function sentmtrl(){
    $dbops=new database();
    $wdate=time()-(57*24*60*60);
    $Y=date("Y",$wdate);
    $M=date("m",$wdate);
    $warning=$Y."-".$M."-01";
    ?>
    <div class="container">
        <div class="page-header">
            <h1>Sent bokföringsmaterial</h1>
        </div>
    <table class="table table-striped table-hover">
        <thead>
            <tr>
                <th class="col-md-10">Kund</th>
                <th class="col-md-2">Bokförd Period</th>
            </tr>
        </thead>
        <tbody>
        <?php
        $sql = "SELECT K.Kund_ID, K.Namn, K.Kundnr FROM tblKund AS K WHERE K.Kund_ID NOT IN (SELECT KundID FROM tblLBokf WHERE Period>='" . $warning ."') AND K.Avslutad = FALSE ORDER BY K.Kundnr";
        $res=$dbops->dbselect($sql);
        //foreach($res as $rows){
            print "<tr>\n";
            print "<td><a href=\"material.php?action=2\">" . $res['Kundnr'] . " - " . $res['Namn'] ."</a>\n";
            print "</td>\n";
            $sql2="SELECT MAX(Period) AS Per FROM tblLBokf WHERE KundID=".$res['Kund_ID'];
                    $subres=$dbops->dbselect($sql2);
                    foreach($subres as $subrow){
                    print "<td>\n";
                    if ($subrow->Per){
                            periodFormat($subrow->Per);
                    }
                    else {
                            print "Uppgift saknas";
                    }
                    }
                    print "</td>\n";
                    print "</tr>\n";
        //}
    print "</tbody>\n";    
    print "</table>\n";
    print "</div>\n";
    
    
}
```

Databasklassen ser ut så här

```php
class database {
    static $connect=FALSE;
    
    function __construct() {
        
        if(self::$connect===FALSE){
            self::$connect=new mysqli(DBHOST,DBUSER,DBPASSW,DBASE)or die("Kan inte ansluta");
            
        }
        
        if(self::$connect->connect_error){
            die("F&aring;r ej kontakt med databasen");
                
        }
    }

    private function excqry($qry){
        if(!$res=self::$connect->query($qry)){
            die('Query error: ' . self::$connect->errno . '-' . self::$connect->error);
        }
        return $res;
    }
    
    function dbselect($sql){ 
        $result = self::excqry($sql);
        $results = array(); 
        while($row=$result->fetch_assoc()){ 
            $results[]=$row;     
        } 
        return $results; 
        
    }
    
}
```

Frågan fungerar om jag kör den i phpMyAdmin och det fungerade när jag returnerade arrayn som object. Men då måste jag iterera genom arrayn istället för ta fram värdena direkt.....om ni förstår vad jag menar

Permalänk: https://www.webforum.nu/p/192787

## #2 — metalboy, 2015-10-01T06:15Z

mysqli::query() returnerar ett objekt av typen mysqli_result. Du kan inte komma åt värdena på det sättet du försöker göra nu, eftersom att resultatet inte är en array.

Du skulle kunna ändra din excqry()-metod så att den ser ut ungefär så här:

```php
private function excqry($qry) {
    if (!$res=self::$connect->query($qry)) {
        die('Query error: ' . self::$connect->errno . '-' . self::$connect->error);
    }
    if ($res->num_rows == 1) {
        // Resultatet innehåller bara en rad, returnera som en array
        return $res->fetch_assoc();
    }
    // Annars, returnera hela mysqli_result-objektet
    return $res;
}
```

Permalänk: https://www.webforum.nu/p/2318845

## #3 — Jester73, 2015-10-03T23:49Z

Hej

Jo, men gör jag inte det i funktionen dbselect?

```php
function dbselect($sql){ 
        $result = self::excqry($sql);
        $results = array(); 
        while($row=$result->fetch_assoc()){ 
            $results[]=$row;     
        } 
        return $results; 
        
    }
```

Det fungerade om jag bytte ut $result-\>fetch_assoc() mot ...fetch_object().
Vad är skillnaden?

Men har jag förstått ditt svar rätt så måste jag returnera svaret på olika sätt beroende på om det är 1 post som hämtas eller flera eller inte ens någon.

Tack på förhand!

Permalänk: https://www.webforum.nu/p/2318850

## #4 — metalboy, 2015-10-04T14:44Z

Aha, ska erkänna att jag inte läste igenom koden så noggrant, så hade helt missat det. Problemet är att dbselect() alltid returnerar en multidimensionell array, men du vill behandla den som en endimensionell array i det här fallet. Då är det alltså i dbselect() du får lägga kollen hur många rader som returneras. Är det bara en rad, returnera $result-\>fetch_assoc(), annars returnera $result-\>fetch_all() (som kan ersätta din while-loop i dbselect()). Alternativt så struntar du i att särbehandla de fallen där det bara är en rad i resultatet och returnerar alltid $result-\>fetch_all(), men du kan du inte göra som du gör nu och försöka behandla det som en endimensionell array.

Permalänk: https://www.webforum.nu/p/2318851

## #5 — Jester73, 2015-10-05T12:51Z

Hej

Får det fortfarande inte att lira men fungerar det att skriva så här?

```php
private function excqry($qry){
        if(!$res=self::$connect->query($qry)){
            die('Query error: ' . self::$connect->errno . '-' . self::$connect->error);
        }
        return $res;
    }
    
    function dbselect($sql){ 
        $result = self::excqry($sql);
      
        if ($result->num_rows == 1) {    
            return $result->fetch_assoc();
        }
        elseif($result->num_rows > 1){
            return $res->fetch_all();
        }
        else {
            return $result;
        }
```

Anledningen till funktionen excqry är bara att just den programsnutten är ju gemensam för övriga funktioner så som delete m.m.

Tack på förhand!

Permalänk: https://www.webforum.nu/p/2318854

## #6 — metalboy, 2015-10-05T13:14Z

Du har angett fel variabelnamn här:

```php
elseif($result->num_rows > 1){ 
            return $res->fetch_all(); 
        }
```

Det ska vara $result-\>fetch_all();

Edit:
Anropa fetch_all() med följande argument: MYSQLI_ASSOC

```php
elseif($result->num_rows > 1){ 
            return $result->fetch_all(MYSQLI_ASSOC); 
        }
```

Permalänk: https://www.webforum.nu/p/2318855

## #7 — Jester73, 2015-10-05T22:29Z

Tack, verkar var min grej på det här forumet. Hälften av mina frågor bottnar i att jag inte har rätt namn på variablerna... :)

Dock så fungerar det fortfarande inte.
När jag kör nedan kod så slänger MySQL iväg 1064 fel utan någon vägledning vad som är fel i frågan.
Jag har kört den mot databasen via phpMyAdmin så frågan "bör" fungera :)

```php
function sentmtrl(){
    $dbops=new database();
    $wdate=time()-(57*24*60*60);
    $Y=date("Y",$wdate);
    $M=date("m",$wdate);
    $warning=$Y."-".$M."-01";
    ?>
    <div class="container">
        <div class="page-header">
            <h1>Sent bokföringsmaterial</h1>
        </div>
    <table class="table table-striped table-hover">
        <thead>
            <tr>
                <th class="col-md-10">Kund</th>
                <th class="col-md-2">Bokförd Period</th>
            </tr>
        </thead>
        <tbody>
        <?php
        $sql = "SELECT K.Kund_ID, K.Namn, K.Kundnr FROM tblKund AS K WHERE K.Kund_ID NOT IN (SELECT KundID FROM tblLBokf WHERE Period>='" . $warning ."') AND K.Avslutad = FALSE ORDER BY K.Kundnr";
        $res=$dbops->dbselect($sql);
        while($res){
            print "<tr>\n";
            print "<td><a href=\"material.php?action=2\">" . $res[Kundnr] . " - " . $res[Namn] ."</a>\n";
            print "</td>\n";
            $sql2="SELECT MAX(Period) AS Per FROM tblLBokf WHERE KundID=".$res[Kund_ID];
                    $subres=$dbops->dbselect($sql2);
                    //foreach($subres as $subrow){
                    print "<td>\n";
                    if ($subres['Per']){
                            periodFormat($subres['Per']);
                    }
                    else {
                            print "Uppgift saknas";
                    }
                    //}
                    print "</td>\n";
                    print "</tr>\n";
        }
    print "</tbody>\n";    
    print "</table>\n";
    print "</div>\n";
    
    
}
```

Permalänk: https://www.webforum.nu/p/2318857

## #8 — metalboy, 2015-10-06T06:04Z

Är det $sql eller $sql2 som genererar felkoden?

Permalänk: https://www.webforum.nu/p/2318858

## #9 — Jester73, 2015-10-06T08:51Z

Skulle säga att det är första frågan.
Klippte ut hela avsnittet som berör fråga 2 och testade och plötsligt blir filen jätteseg att ladda in.

Så här ser databasklassen ut iaf

```php
class database {
    static $connect=FALSE;
    
    function __construct() {
        
        if(self::$connect===FALSE){
            self::$connect=new mysqli(DBHOST,DBUSER,DBPASSW,DBASE)or die("Kan inte ansluta");
            
        }
        
        if(self::$connect->connect_error){
            die("F&aring;r ej kontakt med databasen");
                
        }
    }

    private function excqry($qry){
        if(!$res=self::$connect->query($qry)){
            die('Query error: ' . self::$connect->errno . '-' . self::$connect->error);
        }
        return $res;
    }
    
    function dbselect($sql){
        $result = self::excqry($sql);
      
        if ($result->num_rows == 1) {    
            return $result->fetch_assoc();
        }
        elseif($result->num_rows > 1){
            return $result->fetch_all(MYSQLI_ASSOC);
        }
        else {
            return $result;
        }
    }
    
}
```

Jag kanske inte kan skriva while satsen så här

```php
function sentmtrl(){
    $dbops=new database();
    $wdate=time()-(57*24*60*60);
    $Y=date("Y",$wdate);
    $M=date("m",$wdate);
    $warning=$Y."-".$M."-01";
    ?>
    <div class="container">
        <div class="page-header">
            <h1>Sent bokföringsmaterial</h1>
        </div>
    <table class="table table-striped table-hover">
        <thead>
            <tr>
                <th class="col-md-10">Kund</th>
                <th class="col-md-2">Bokförd Period</th>
            </tr>
        </thead>
        <tbody>
        <?php
        $sql = "SELECT K.Kund_ID, K.Namn, K.Kundnr FROM tblKund AS K WHERE K.Kund_ID NOT IN (SELECT KundID FROM tblLBokf WHERE Period>='" . $warning ."') AND K.Avslutad = FALSE ORDER BY K.Kundnr";
        $res=$dbops->dbselect($sql);
        while($res){
            print "<tr>\n";
            print "<td><a href=\"material.php?action=2\">" . $res[Kundnr] . " - " . $res[Namn] ."</a>\n";
            print "</td>\n";
            
           
            print "</tr>\n";
        }
    print "</tbody>\n";    
    print "</table>\n";
    print "</div>\n";
    
    
}
```

Permalänk: https://www.webforum.nu/p/2318860

## #10 — metalboy, 2015-10-06T09:44Z

Hur många rader förväntar du dig i resultatet? Om du förväntar dig exakt 1 rad, då ska du inte ha någon while-loop alls, förväntar du dig flera rader så måste du loopa igenom dem.

1 rad i resultatet:

```php
$res = $dbops->dbselect($sql);
print $res['Kundnr'];
```

Flera rader i resultatet:

```php
$result = $dbops->dbselect($sql);
foreach ($result as $res) {
    print $res['Kundnr'];
}
```

Permalänk: https://www.webforum.nu/p/2318861

## #11 — Jester73, 2015-10-06T10:50Z

TACK!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!:birp:birp:birp

Nu funkar "skiten"

Måste läsa på While och Foreach m.m. och lära mig när jag skall använda vad

Permalänk: https://www.webforum.nu/p/2318862

---

Tråden på webben: https://www.webforum.nu/amne/php/192787-fel-i-databasklass
