Avatar billede danic Nybegynder
20. januar 2009 - 18:27 Der er 29 kommentarer og
1 løsning

Script fejl pga. PHP5

Efter at have flyttet mine php scripts til php5, er jeg løbet ind i problemer, nogle forslag til hvad der er galt her?

Fatal error: Using $this when not in object context in classes/database.class.php on line 58

57 // Implode $sql_columns_use and $sql_value_use into an SQL insert sqlstatement
58 $this->SQLStatement = "INSERT INTO
59 ".$tbl." (".implode(",",$sql_columns_use).
60 ") VALUES (".implode(",",$sql_value_use).
")";
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 19:42 #1
Hvor kommer $this fra? Kan du give den et andet navn?
Avatar billede danic Nybegynder
20. januar 2009 - 19:47 #2
Tror du det er navnet?

Du får lige hele funktionen her:

function AddToDB($tbl)
{
// Set the arrays we'll need
$sql_columns = array();
$sql_columns_use = array();
$sql_value_use = array();

// Pull the column names from the table $tbl
$pull_cols = mysql_query("SHOW COLUMNS
FROM ".$tbl) or die("MYSQL ERROR:
".mysql_error());

// Pull an associative array of the column names and put them into a non-associative array
while ($columns =
mysql_fetch_assoc($pull_cols))
  $sql_columns[] = $columns["Field"];

foreach( $_POST as $key => $value )
{
  // Check to see if the variables match up with the column names
  if ( in_array($key, $sql_columns)
  && trim($value) )
  {
  // If this variable contains the string "DATESTAMP" then use MYSQL function NOW()
  if ($value == "DATESTAMP")
  $sql_value_use[] = "NOW()";
  else
  {
    // If this variable contains a number, then don't add single quotes, otherwise check to see
    // if magic quotes are on and use addslashes if they aren't
    if ( is_numeric($value) )
    $sql_value_use[] = $value;
    else
    $sql_value_use[] =
    ( get_magic_quotes_gpc() ) ?
    "'".$value."'" : "'"
    .addslashes($value)."'";
  }
  // Put the column name into the array
  $sql_columns_use[] = $key;
  }
}

// If $sql_columns_use or $sql_value_use are empty then that means no values matched
if ( (sizeof($sql_columns_use) == 0) ||
(sizeof($sql_value_use) == 0) )
{
// Set $Error if no values matched
$this->Error = "Error: No values were
passed that matched any columns.";
return false;
}
else
{
// Implode $sql_columns_use and $sql_value_use into an SQL insert sqlstatement
$this->SQLStatement = "INSERT INTO
".$tbl." (".implode(",",$sql_columns_use).
") VALUES (".implode(",",$sql_value_use).
")";

// Execute the newly created statement
if ( @mysql_query($this->SQLStatement) )
  return true;
else
{
// Set $Error if the execution of the
// statement fails
$this->Error = "Error: ".mysql_error();
  return false;
  }
}
} // end func
Avatar billede majbom Novice
20. januar 2009 - 19:52 #3
er det al din kode?

umiddelbart ser der ud til at mangle noget, jeg kan ikke se hvor $this kommer ind i billedet
Avatar billede danic Nybegynder
20. januar 2009 - 20:22 #4
Ups, glemte et par funktioner:

// If $sql_value_use is empty then that means no values matched
if ( sizeof($sql_value_use) == 0 )
{
  // Set $Error if no values matched
  $this->Error = "Error: No values
  were passed that matched any columns.";
  return false;
}
else
{
  // Implode $sql_value_use into an SQL insert sqlstatement
  $this->SQLStatement = "UPDATE ".$tbl."
  SET ".implode(",",$sql_value_use)."
  WHERE ".$id_name."=".$id;

  // Execute the newly created
  // statement
  if ( @mysql_query($this->SQLStatement) )
  return true;
  else
  {
  // Set $Error if the execution of the statement fails
  $this->Error = "Error: ".mysql_error();
  return false;
  }
}
} // end func
Avatar billede danic Nybegynder
20. januar 2009 - 20:23 #5
Det hele kom ikke med:

function UpdateDB($tbl, $id, $id_name)
{
// Set the arrays we'll need
$sql_columns = array();
$sql_value_use = array();

// Pull the column names from the table $tbl
$pull_cols = mysql_query("SHOW COLUMNS FROM ".$tbl) or die(  "MYSQL ERROR: ".mysql_error() );

// Pull an associative array of the column names and put them into a non-associative array
while ($columns = mysql_fetch_assoc($pull_cols))
  $sql_columns[] = $columns["Field"];

foreach($_POST as $key => $value)
{
  // Check to see if the variables match up with the column names
  if ( in_array($key, $sql_columns)
  && isset($value) )
  {
  // If this variable contains the string "DATESTAMP" then use MYSQL function NOW()
  if ($value == "DATESTAMP")
    $sql_value_use[] = $key."=NOW()";
  else
  {
    // If this variable contains a number, then don't add single quotes, otherwise check to see
    // if magic quotes are on and use addslashes if they aren't
    if ( is_numeric($value) )
    $sql_value_use[] = $key."=".$value;
    else
    $sql_value_use[] = (
    get_magic_quotes_gpc() ) ?
    $key."='".$value."'" : $key."=
    '".addslashes($value)."'";
  }
  }
}

// If $sql_value_use is empty then that means no values matched
if ( sizeof($sql_value_use) == 0 )
{
  // Set $Error if no values matched
  $this->Error = "Error: No values
  were passed that matched any columns.";
  return false;
}
else
{
  // Implode $sql_value_use into an SQL insert sqlstatement
  $this->SQLStatement = "UPDATE ".$tbl."
  SET ".implode(",",$sql_value_use)."
  WHERE ".$id_name."=".$id;

  // Execute the newly created
  // statement
  if ( @mysql_query($this->SQLStatement) )
  return true;
  else
  {
  // Set $Error if the execution of the statement fails
  $this->Error = "Error: ".mysql_error();
  return false;
  }
}
} // end func
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 20:24 #6
Har du defineret en klasse: class ...
Avatar billede danic Nybegynder
20. januar 2009 - 20:34 #7
Det er lidt mærkeligt nu fandt jeg den guilde jeg har benyttet:
http://www.devshed.com/c/a/MySQL/Dynamically-Insert-and-Update-values-in-a-MySQL-database-using-OOP/1/

Der står:
function MyDatabase()
{
  // Config for the database
  // connection
  $this->DBUser = "tmp_usr";
  $this->DBPass = "<A href="mailto:super#secret@pass">super#secret@pass</A>";
  $this->DBName = "c_test";
  $this->DBHost = "localhost";
}

function Connect()
{
  //Connect to a mysql database
  $this->db = mysql_connect($this->DBHost,
  $this->DBUser, $this->DBPass) or
  die("MYSQL ERROR: ".mysql_error());
  // Select the database
  mysql_select_db($this->DBName,
  $this->db) or die("MYSQL ERROR:
  ".mysql_error());
}

// Disconnect from the MYSQL database
function Disconnect()
{
  mysql_close($this->db) or die("MYSQL
  ERROR: ".mysql_error());
}
}

Men jeg har altid åbnet databasen unden denne kode det har ikke givet problemer før nu. Dvs. ikke brugt den her kode.
Avatar billede danic Nybegynder
20. januar 2009 - 20:36 #8
Jeg kalder den sådan her:

require($_SERVER["DOCUMENT_ROOT"] . "/admin/classes/database.class.php");

if (isset($_POST['send']))
{
opendb();
$_POST['newsbody'] = nl2br($_POST['newsbody']);
AddToDB(news);
msgandlink("Du har nu gemt nyheden");
closedb();
}
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 20:38 #9
Så brug dog hele koden fra det link ;)
Avatar billede danic Nybegynder
20. januar 2009 - 20:42 #10
Jeg vil helst ikke rette en masse kode, hvis det nu kun er få rettelser.
Avatar billede danic Nybegynder
20. januar 2009 - 20:45 #11
Den connect jeg benytter i dag ser sådan her ud:

function opendb() {

$db = mysql_connect("$_SESSION[server]", "$_SESSION[bruger]", "$_SESSION[kodeord]");
    if (!$db)
    {   
    error("Kunne ikke oprette en forbindelse til MySQL.");
    exit;
    }
    // vælg base der skal arbejdes med
    $checkBaseConnect = mysql_select_db($_SESSION['database'],$db);

if(!$checkBaseConnect)
    {
    print"<script language=\"JavaScript\">alert($database)</script>";
    exit;
    }
return $db;
} // end func


function closedb() {
  if(!mysql_close()) {
    udskriv_fejl("Kunne ikke lukke forbindelsen til MySQL!");
  }

Tror du jeg kan sammensætte den med den anden?
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 20:45 #12
Det er helt i orden, hvis du ikke vil have det til at virke. Men hvorfor spørger du så?

Nå, spøg til side: du mangler nogle linier med "class" - ik'?
Avatar billede danic Nybegynder
20. januar 2009 - 20:48 #13
:-) Der er ingen linier med class i min gamle kode.
Avatar billede danic Nybegynder
20. januar 2009 - 20:50 #14
Men i guiden står der:

class MyDatabase
{
// The var that stores the last
// used SQL statement
var $SQLStatement = "";

// The var that stores the error
// (if any)
var $Error = "";
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 20:53 #15
Guiden er fra 2004 - hvad med at komme lidt tættere på civiliseret tid?

Det vil ikke virke i PHP5 uden at proppe det ind i en class.
Avatar billede danic Nybegynder
20. januar 2009 - 20:55 #16
Det er et site som jeg ikke har rørt ved siden 2004, som nu er flyttet til php5.
Avatar billede danic Nybegynder
20. januar 2009 - 21:00 #17
Nu har jeg sat dem sammen, skal jeg kalde klassen?

class MyDatabase
{
// The var that stores the last
// used SQL statement
var $SQLStatement = "";

// The var that stores the error
// (if any)
var $Error = "";

function MyDatabase()
{
$this->DBUser = "$_SESSION[bruger]";
$this->DBPass = "$_SESSION[kodeord]";
$this->DBName = "$_SESSION[database]";
$this->DBHost = "$_SESSION[server]";
}

function opendb()
{
// Connect to a mysql database
$this->db = mysql_connect($this->DBHost,
$this->DBUser, $this->DBPass) or
die("MYSQL ERROR: ".mysql_error());
// Select the database
mysql_select_db ($this->db,
$this->{$this->DBConnection}) or
die("MYSQL ERROR: ".mysql_error());
}

// Disconnect from the MYSQL database
function closedb()
{
  mysql_close($this->db) or die("MYSQL
  ERROR: ".mysql_error());
}
}
Avatar billede danic Nybegynder
20. januar 2009 - 21:02 #18
åbenbart: Call to undefined function opendb()

Hvordan starter jeg klassen??? (her ikke programmeret siden 2004)
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 21:09 #19
Så er det synd du har valgt det eksempel som udgangspunkt.

Men du skal noget i denne retning:

$s = new MyDatabase();
$s->opendb();
//....
Avatar billede danic Nybegynder
20. januar 2009 - 21:20 #20
Nu har jeg indsat:
    // Instantiate the class
    $SQL = new MyDatabase;
    $SQL->opendb();

Men nu skriver den:
Fatal error: Cannot access empty property in connections/dbremote.php on line 29

28: mysql_select_db ($this->db,
29: $this->{$this->DBConnection}) or
30: die("MYSQL ERROR: ".mysql_error());
Avatar billede danic Nybegynder
20. januar 2009 - 21:25 #21
Fandt fejlen, nu ser det ud til at virke - Tak for hjælpen...... lader den lige stå åben til jeg har testet den igennem.
Avatar billede danic Nybegynder
20. januar 2009 - 21:33 #22
hm....

Stadig samme problem selv om jeg nu benytter klassen:

<?
include($_SERVER["DOCUMENT_ROOT"] . "/admin/security.php");
include($_SERVER["DOCUMENT_ROOT"] . "/admin/market/marketmenu.php");
require($_SERVER["DOCUMENT_ROOT"] . "/admin/classes/database.class.php");
?>

<?php

if (isset($_POST['send']))
{
// Instantiate the class
$SQL = new MyDatabase;
$SQL->opendb();

$_POST['newsbody'] = nl2br($_POST['newsbody']);
AddToDB(news);
msgandlink("Du har nu gemt nyheden", "directory=market&attach=news");
$SQL->closedb();
}

?>

Nogle nye ideer?
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 21:48 #23
Det skal vel være

  $SQL->AddToDB(news);

Men hvad med at læse op på det først, i stedet for at prøve dig frem? http://php.net/ er et ok sted at starte.
Avatar billede erikjacobsen Ekspert
20. januar 2009 - 21:50 #24
Eller rettere for at give lidt mening

  $SQL->AddToDB('news');
Avatar billede danic Nybegynder
21. januar 2009 - 15:25 #25
erikjacobsen> det virker, du må gerne komme med et svar.
Avatar billede erikjacobsen Ekspert
21. januar 2009 - 15:26 #26
Jeg samler slet ikke på point, tak.
Avatar billede danic Nybegynder
21. januar 2009 - 16:48 #27
ok
Avatar billede majbom Novice
21. januar 2009 - 18:00 #28
-> danic - læg et svar selv og accpeter, så vi kan få lukket spørgsmålet :)
Avatar billede majbom Novice
04. november 2010 - 10:58 #29
kan vi lukke hér?
Avatar billede danic Nybegynder
16. november 2010 - 19:04 #30
svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester

IT-JOB

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Teamleder til AL Sydbanks GDPR & Tech Regulation i Aabenraa

AL Sydbank A/S (tidligere Arbejdernes Landsbank)

Tech Lead til Datacenter Operations

Forsvarsministeriets Materiel- og Indkøbsstyrelse

Nye kolleger søges til IT Stab i Forsvaret

Netcompany A/S

Linux Operations Engineer