"expects parameter 1 to be mysqli, null given"

PHPportalen Forum Index » PHP Mjukstart
Lägg ett bokmärke på hela tråden
Skapa nytt inlägg   Svara på inlägget
Visa föregående ämne :: Visa nästa ämne  
Startad av: Meddelande
Guldstrand



Medlem i: 5748 dagar
Från: Lindesberg, Örebro
Status: Offline



#742145
Inlägg Skrivet: 2018-03-28 14:54      Ämne: "expects parameter 1 to be mysqli, null given" Citera

Tjenare.. längesedan man var här
Jag har nyligen uppgraderat en del programvara på min server, bl.a. till PHP7.0, och "måste" då börja använda mysqli istället för mysql.

Detta har såklart stött på en del problem i mina script och jag behöver därför all hjälp jag kan få.
I första hand är det följande kod/funktion som skapar en del fel.

PHP:
1:
 function dbconn($autoclean false)
2:
{
3:
    global $mysql_host$mysql_user$mysql_pass$mysql_db;
4:
    if (!@mysqli_connect($mysql_host$mysql_user$mysql_pass))
5:
    {
6:
     switch (mysqli_errno())
7:
     {
8:
      case 1040:
9:
      case 2002:
10:
         if ($_SERVER['REQUEST_METHOD'] == "GET")
11:
            die("<html><head><meta http-equiv='refresh' content=\"5 $_SERVER[REQUEST_URI]\"></head><body><table border='0' width='100%' height='100%'><tr><td><h3 align='center'>The server load is very high at the moment. Retrying, please wait...</h3></td></tr></table></body></html>");
12:
         else
13:
            die("Too many users. Please press the Refresh button in your browser to retry.");
14:
        default:
15:
           die("[" mysqli_errno() . "] dbconn: mysqli_connect: " mysqli_error());
16:
      }
17:
    }
18:
    mysql_select_db($mysql_db)
19:
        or die('dbconn: mysqli_select_db: ' mysqli_error());
20:
    userlogin();
21:
    if ($autoclean)
22:
        register_shutdown_function("autoclean");
23:

(Det är inte jag som har skapat denna funktion.)

PHP:
1:
 
2:
Warningmysqli_select_db() expects parameter 1 to be mysqlinull given
3:
Warningmysqli_error() expects parameter 1 to be mysqlinull given 
 

_________________
Det jag inte redan kan vill jag gärna lära mig...
Guldstrand -Nybörjare på Php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
webbhelp



Medlem i: 4411 dagar
Från: Sverige
Status: Offline



#742146
Inlägg Skrivet: 2018-03-28 19:08      Ämne: Citera

Ska du använda mysqli måste du ha med dig anslutning vid varje anrop.

Dock ser jag att du inte använder mysqli_select_db som det står i felmeddelandet utan mysql_select_db
Här är dokumentation om du vill använda mysqli
http://php.net/manual/en/mysqli.select-db.php

Du ska lagra mysqli_connect() i en variabel och använda den variabeln vid resten av anropen.

Exempel:
KOD:
1:
 
2:
$link = mysqli_connect($mysql_host, $mysql_user, $mysql_pass);
3:
mysqli_select_db ( $link , 'database_name' );
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Skicka e-post Besök användarens hemsida MSN Messenger
Guldstrand



Medlem i: 5748 dagar
Från: Lindesberg, Örebro
Status: Offline



#742147
Inlägg Skrivet: 2018-03-29 11:01      Ämne: Citera

Tack för hjälpen!
Men som det är nu, måste jag alltså lägga till mysqli-anslutningen till alla databasförfrågningar?

Det var det som jag ville slippa genom att ändra den globala funktionen dbconn(). Confused
Syftet med att ha funktioner försvinner då ju?

PHP:
1:
 function dbconn($autoclean false)
2:
{
3:
    global $mysql_host$mysql_user$mysql_pass$mysql_db;
4:
   $link mysqli_connect($mysql_host$mysql_user$mysql_pass);
5:
   
6:
    if (!isset($link))
7:
    {
8:
     switch (mysqli_errno($link))
9:
     {
10:
      case 1040:
11:
      case 2002:
12:
         if ($_SERVER[REQUEST_METHOD] == "GET")
13:
            die("<html><head><meta http-equiv=refresh content=\"5 $_SERVER[REQUEST_URI]\"></head><body><table border=0 width=100% height=100%><tr><td><h3 align=center>The server load is very high at the moment. Retrying, please wait...</h3></td></tr></table></body></html>");
14:
         else
15:
            die("Too many users. Please press the Refresh button in your browser to retry.");
16:
        default:
17:
           die("[" mysqli_errno($link) . "] dbconn: mysqli_connect: " mysqli_error($link));
18:
      }
19:
    }
20:
    mysqli_select_db($link$mysql_db)
21:
        or die('dbconn: mysqli_select_db: ' mysqli_error($link));
22:
 
23:
    userlogin();
24:
 
25:
    if ($autoclean)
26:
        register_shutdown_function("autoclean");
27:
 

_________________
Det jag inte redan kan vill jag gärna lära mig...
Guldstrand -Nybörjare på Php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Saurid
Moderator



Medlem i: 5391 dagar
Från: Karlshamn
Status: Offline



#742148
Inlägg Skrivet: 2018-03-29 13:56      Ämne: Citera

Guldstrand skrev:
Tack för hjälpen!
Men som det är nu, måste jag alltså lägga till mysqli-anslutningen till alla databasförfrågningar?

Det var det som jag ville slippa genom att ändra den globala funktionen dbconn(). Confused

Ja, tyvärr kommer du nog inte undan.

Det finns två sätt att göra det på. Antingen skickar du med anslutningen som argument varje gång du anropar som första argument, ex mysqli_query($con, $query). Eller så använder du mysql-objektet för att göra samma sak, ex $mysqli->query($query).

Guldstrand skrev:
Syftet med att ha funktioner försvinner då ju?

Nejdå, fast du behöver använda dem annorlunda. I ditt fall så skulle funktionen dbconn kunna returnera mysqli-objektet från funktionen så att du får tillgång till den även utanför.

Vill man vara riktigt ful (de flesta kommer att hålla med mig här och jag kan absolut inte rekommendera det) så kan man använda en global variabel för att lagra databasanslutningen. Du måste fortfarande skicka med anslutningen varje gång du kör en fråga, men du måste ju ändå ändra från mysql_query till mysqli_query.

Vill man göra det liiite bättre så kan man använda en globalt object (singleton) som lagrar databasanslutningen. Då har du också åtkomst till ditt anslutningen överallt. Men det kräver lite mer jobb.
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Guldstrand



Medlem i: 5748 dagar
Från: Lindesberg, Örebro
Status: Offline



#742149
Inlägg Skrivet: 2018-03-29 14:04      Ämne: Citera

Saurid skrev:
Vill man göra det liiite bättre så kan man använda en globalt object (singleton) som lagrar databasanslutningen. Då har du också åtkomst till ditt anslutningen överallt. Men det kräver lite mer jobb.

Hur skulle det se ut?
 

_________________
Det jag inte redan kan vill jag gärna lära mig...
Guldstrand -Nybörjare på Php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Guldstrand



Medlem i: 5748 dagar
Från: Lindesberg, Örebro
Status: Offline



#742150
Inlägg Skrivet: 2018-04-02 16:05      Ämne: Citera

Är fortfarande fast med detta.

Har följande fel:
PHP:
1:
 Warningmysqli_select_db() expects exactly 2 parameters1 given 


Detta är funktionen.
PHP:
1:
 function dbconn($autoclean false)
2:
{
3:
    global $mysql_host$mysql_user$mysql_pass$mysql_db
4:
   $link mysqli_connect($mysql_host$mysql_user$mysql_pass); 
5:
   mysqli_select_db($mysql_db);
6:
   
7:
 
8:
    if (!@mysqli_connect($link))
9:
    {
10:
     switch (mysqli_errno($link))
11:
     {
12:
      case 1040:
13:
      case 2002:
14:
         if ($_SERVER[REQUEST_METHOD] == "GET")
15:
            die("<html><head><meta http-equiv=refresh content=\"5 $_SERVER[REQUEST_URI]\"></head><body><table border=0 width=100% height=100%><tr><td><h3 align=center>The server load is very high at the moment. Retrying, please wait...</h3></td></tr></table></body></html>");
16:
         else
17:
            die("Too many users. Please press the Refresh button in your browser to retry.");
18:
        default:
19:
           die("[" mysqli_errno($link) . "] dbconn: mysqli_connect: " mysqli_error($link));
20:
      }
21:
    }
22:
        or die('dbconn: mysqli_select_db: ' mysqli_error($link));
23:
 
24:
    userlogin();
25:
 
26:
    if ($autoclean)
27:
        register_shutdown_function("autoclean");
28:

Jag vill gärna kunna använda alla gamla funktioner och är därför supertacksam för om någon kunde hjälpa mig att ändra funktionen ovan så att den fungerar med mysqli.
 

_________________
Det jag inte redan kan vill jag gärna lära mig...
Guldstrand -Nybörjare på Php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Azreal
Administratör



Medlem i: 4913 dagar
Från: Uppsala, bor i Göteborg
Status: Offline



#742151
Inlägg Skrivet: 2018-04-02 16:51      Ämne: Citera

Felmeddelandet säger exakt vad som är tokigt. Den vill ha två parametrar men du har bara anget en.
Läs på php.ner om funktionen mysqli_select_db() samt titta på exemplen så ser du exakt hur duvska göra.
 

_________________
Konsultation via PM, inte gratis.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Guldstrand



Medlem i: 5748 dagar
Från: Lindesberg, Örebro
Status: Offline



#742152
Inlägg Skrivet: 2018-04-02 16:55      Ämne: Citera

Azreal skrev:
Felmeddelandet säger exakt vad som är tokigt. Den vill ha två parametrar men du har bara anget en.
Läs på php.ner om funktionen mysqli_select_db() samt titta på exemplen så ser du exakt hur duvska göra.

Nja, SÅ enkelt är det tydligen inte.
jag har stirrat mig blind på detta. Confused
 

_________________
Det jag inte redan kan vill jag gärna lära mig...
Guldstrand -Nybörjare på Php
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
Azreal
Administratör



Medlem i: 4913 dagar
Från: Uppsala, bor i Göteborg
Status: Offline



#742153
Inlägg Skrivet: 2018-04-02 17:18      Ämne: Citera

Och du har varit in på php.net och läst om funktionen, tittat på exemplen där och jämfört det med din kod?
 

_________________
Konsultation via PM, inte gratis.
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Saurid
Moderator



Medlem i: 5391 dagar
Från: Karlshamn
Status: Offline



#742154
Inlägg Skrivet: 2018-04-05 17:14      Ämne: Citera

Som Azreal är inne på, svaren finns i manualen. mysqli_select_db() tar två argument, där det första är anslutningen mot servern och det andra är namnet på databasen. Alltså samma sak som vi tidigare pratat om.

Ska se om jag kan hinna slänga ihop en liten singleton som levererar en databasanslutning...

EDIT:

Exempel på en Singletonclass (utan felhantering):
PHP:
1:
 class Db
2:
{
3:
    // Databasuppgifter
4:
    private $mysql_host 'localhost';
5:
    private $mysql_db 'wordpress';
6:
    private $mysql_user 'root';
7:
    private $mysql_pass '';
8:
 
9:
    // Anslutning till databasen
10:
    private $connection null;
11:
 
12:
    // En instans av typen Db
13:
    private static $instance null;
14:
 
15:
    // Se till att det inte går att skapa ett nytt objekt
16:
    private function __construct() {}
17:
    private function __clone() {}
18:
    private function __wakeup() {}
19:
 
20:
    // Skapa och returnera en instans av typen Db
21:
    public static function getInstance()
22:
    {
23:
        if (self::$instance === null) {
24:
            self::$instance = new Db();
25:
        }
26:
        return self::$instance;
27:
    }
28:
 
29:
    // Skapa och returnera databasanslutning
30:
    public function connection()
31:
    {
32:
        if ($this->connection === null) {
33:
            $this->connection mysqli_connect($this->mysql_host$this->mysql_user$this->mysql_pass);
34:
            mysqli_select_db($this->connection$this->mysql_db);
35:
        }
36:
 
37:
        return $this->connection;
38:
    }
39:


För att hämta databasanslutningen på övriga ställen i din kod:
KOD:
1:
Db::getInstance()->connection()


Hela idén med en Singleton är att man aldrig ska kunna skapa mer än ett likadant obekt. I ditt fall aldrig mer än en anslutning mot databasen. Hur många gånger du än anropar den och varifrån det än är, så returnerar den samma objekt/databasanslutning.

Som sagt, jag är inte så värst förtjust i denna lösningen heller. Men ibland får man kanske välja mellan olika lösningar och bara acceptera att läget är som det är med en gammal kod Smile
 

_________________
waljefors.se :: waeke.se :: GitHub :: SoundCloud
Till toppen på sidan
Visa användarprofil Skicka privat meddelande Besök användarens hemsida
Visa tidigare inlägg:   
Skapa nytt inlägg   Svara på inlägget
PHPportalen Forum Index » PHP Mjukstart
Hoppa till:  
Du kan inte skapa nya inlägg i det här forumet
Du kan inte svara på inlägg i det här forumet
Du kan inte ändra dina inlägg i det här forumet
Du kan inte ta bort dina inlägg i det här forumet
Du kan inte rösta i det här forumet
Du kan inte bifoga filer i detta forum
Du kan inte ladda ner filer från detta forum
Kontakta oss på adressen: info@phpportalen.net
Webbplatsen bygger i grunden på phpBB © 2001, 2002 phpBB Group

Modifieringar har senare gjorts i systemet av PHPportalen
Sid och logotypdesign skapad av Daren Jularic