Problem med PDO - undefined variable.

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
PaulMcShit



Medlem i: 2153 dagar

Status: Offline



#741812
Inlägg Skrivet: 2017-08-08 16:40      Ämne: Problem med PDO - undefined variable. Citera

Efter många år av pause ska jag nu sätta mig in i programmeringen igen. Jag har nu stött på ett problem som jag inte kommer förbi, ett problem där lösningen troligtvis ligger precis framför näsan på mig. Jag uppskattar all hjälp jag kan få för att komma förbi- men också förstå varför problemet har uppstått.

Anslutningen till databasen fungerar då det inte genereras några felmeddelanden. Jag har dubbelkollat detta genom att ange felaktiga anslutningsuppgifter som i sin tur har genererat felmeddelanden.



index.php
PHP:
1:
 require(getcwd() . '/database/db.class.php');
2:
$database = new Database;
3:
$database->insert_names_into_db('Hasse''Hansson'); 


db.class.php
PHP:
1:
<?php
2:
// Database connection PDO
3:
class Database {
4:
   public function __construct() {
5:
      // Try to connect to the databse. If any errors occur, write error message into a lof file.
6:
      try {
7:
         $db = new PDO('mysql:host=localhost;dbname=ajax_test''root''');
8:
         $db->setAttribute(PDO::ATTR_ERRMODEPDO::ERRMODE_EXCEPTION);
9:
 
10:
      } catch (PDOException $e) {
11:
         // Log database errors to a file.
12:
         $path getcwd() .  '/logs/db_errors.txt';
13:
         $handle fopen($path'a+');
14:
         fwrite($handledate('Y-m-d H:i:s') . ' | ' $e->getMessage() . ';;$$');
15:
         fclose($handle);
16:
      }
17:
   }
18:
 
19:
   public function readDBErrorLog() {
20:
      // This function makes the log file more readable.
21:
      if (file_exists($path getcwd() . '/logs/db_errors.txt')) {
22:
         // Read database error log.
23:
         $path getcwd() . '/logs/db_errors.txt';
24:
         $handle fopen($path'r');
25:
         $content fread($handlefilesize($path));
26:
         fclose($handle);
27:
 
28:
         $errorLogArray explode(';;$$'$content);
29:
         foreach ($errorLogArray as $log) {
30:
            echo $log '<br>';
31:
         }
32:
      }
33:
   }
34:
 
35:
   public function insert_names_into_db($first_name$last_name) {
36:
      $sql 'INSERT INTO names(first_name, last_name, post_date) VALUES(:first_name, :last_name, :post_date)';
37:
      $stmt $db->prepare($sql);
38:
      $stmt->bindParam(':first_name'$first_name);
39:
      $stmt->bindParam(':last_name'$last_name);
40:
      $stmt->bindParam(':post_date'NOW());
41:
 
42:
      $stmt->execute();
43:
 
44:
      echo 'Executed!';
45:
      $db null;
46:
   }
47:
}
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4112 dagar
Från: Tavesta
Status: Offline



#741813
Inlägg Skrivet: 2017-08-08 20:15      Ämne: Citera

$db är bara en lokal variabel som bara kan användas i konstruktorfunktionen.
Om du vill komma åt den utanför just den funktionen kan du använda $this->db istället.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
PaulMcShit



Medlem i: 2153 dagar

Status: Offline



#741814
Inlägg Skrivet: 2017-08-08 20:46      Ämne: Citera

harald_b skrev:
$db är bara en lokal variabel som bara kan användas i konstruktorfunktionen.
Om du vill komma åt den utanför just den funktionen kan du använda $this->db istället.


När jag justerade rad 37 till $stmt = $this->db->prepare($sql); så får jag ett nytt felmeddelande där det står Undefined propery istället för Undefined variable.

 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4112 dagar
Från: Tavesta
Status: Offline



#741816
Inlägg Skrivet: 2017-08-09 11:12      Ämne: Citera

Du måste ändra på rad 7 och 8 också
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
PaulMcShit



Medlem i: 2153 dagar

Status: Offline



#741817
Inlägg Skrivet: 2017-08-09 14:58      Ämne: Citera

harald_b skrev:
Du måste ändra på rad 7 och 8 också

Du får ursäkta mig om jag är lite trög.
Jag har provat att tilldela rad 7 och 8 som både private, public, protected, vilket jag antar är det du syftar på att jag måste ändra på. Men då säger den ifrån med följande felmeddelande oavsett vilken av egenskaperna jag tilldelar variabeln:
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4112 dagar
Från: Tavesta
Status: Offline



#741818
Inlägget är accepterad som det rätta svaret Skrivet: 2017-08-09 23:14      Ämne: Citera

Det där med private eller public handlar om åtkomst utanför din class, vilket inte är problemet just nu, vad jag kan se.
I det här fallet är det viktiga att du ändrar $db till $this->db, så variabeln blir en del av objektet, istället för en temporär variabel.
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
PaulMcShit



Medlem i: 2153 dagar

Status: Offline



#741819
Inlägg Skrivet: 2017-08-10 17:27      Ämne: Citera

harald_b skrev:
Det där med private eller public handlar om åtkomst utanför din class, vilket inte är problemet just nu, vad jag kan se.
I det här fallet är det viktiga att du ändrar $db till $this->db, så variabeln blir en del av objektet, istället för en temporär variabel.

Då är jag med på banan, tack så mycket!
Jag fick för mig att man kunde deklarera variabler som vanligt och att man sedan med hjälp av $this-> fick åtkomst till dem när de ligger i en annan funktion.
Så slutsatsen är alltså att om jag vill kunna använda en variabel överallt inom samma klass så måste den deklareras med $this->var. Och private/public har bara att göra med hurvida man kan anropa en funktion eller variabel utanför klassen?
 
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
harald_b
Moderator



Medlem i: 4112 dagar
Från: Tavesta
Status: Offline



#741820
Inlägg Skrivet: 2017-08-11 01:28      Ämne: Citera

Du har nog uppfattat saken rätt.

$this->db och $db räknas alltid som två olika variabler. Du kan använda dem samtidigt till två helt olika saker om du vill.
Men $this och $database är just här bara två olika namn på samma objekt
 

_________________
R.r - Ett fritt affärssystem
Till toppen på sidan
Visa användarprofil Skicka privat meddelande
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