Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

A link to the server could not be established

Tags:

database

php

A very simple insert function, and yet. It gives some nasty errors...

Like:

Warning: mysql_query(): Access denied for user '***.'@'***.one.com' (using password: NO) in /customers/***.be/***.be/httpd.www/belastingen/classes/btw.php on line 24 Warning: mysql_query(): A link to the server could not be established in /customers/***.be/***.be/httpd.www/belastingen/classes/btw.php on line 24

And this is the code:

<?php

    if(isset($_POST['submit'])){

    $naam = $_POST['name'];
    $email = $_POST['email'];
    $kind1 = $_POST['kind1'];
    $kind2 = $_POST['kind2'];
    $kind3 = $_POST['kind3'];
    $kind4 = $_POST['kind4'];
    $kind5 = $_POST['kind5'];
    $captcha = $_POST['captcha'];

        if ($captcha == 2){
            if (!empty($_POST['name']) && !empty($_POST['email']) && !empty($_POST['kind1'])) {
                    $insert = "INSERT INTO belastingen (ouder, email, kind1, kind2, kind3, kind4, kind5) VALUES (
                            '".$naam."',
                            '".$email."',
                            '".$kind1."',
                            '".$kind2."',
                            '".$kind3."',
                            '".$kind4."',
                            '".$kind5."')";
                if (!mysql_query($insert)) {
                    echo "<div class=\"feedback\">query invoeren faalt</div>";
                } else { 
                    echo "<div class=\"feedback\">Uw registratie werd goed geregistreerd</div>";
                }


                }    else {
                echo "<div class=\"feedback\">falen, niveau 2</div>";
            }
        } else {
            echo "<div class=\"feedback\">captcha probleem</div>";
        }
    }   
?>

And don't worry about the MySQL-injection. Adding as we speak. Any thought about the error? And yes I'm sure the data for connection to the database are correct.

UPDATE 1 This is my inc.php-file, included on top of the index.php file.

<?php
  define('MYSQL_HOST',  '***.be.mysql');
  define('MYSQL_DB',    '***');
  define('MYSQL_USER',  '***');
  define('MYSQL_PASSW', '***');

  require_once 'classes/dbconnections.php';
  require_once 'classes/btw.php';
  $_DB = new DBConnection(MYSQL_HOST, MYSQL_DB, MYSQL_USER, MYSQL_PASSW);
?>

UPDATE 2 This is my dbconnections.php-file

<?php

class DBConnection {

  public  $host;
  public  $db;
  public  $user;
  public  $password;

  private $_connection;

  public function __construct($host = null, $db = null, $user = null, $password = null) {
    $this->host     = $host;
    $this->db       = $db;
    $this->user     = $user;
    $this->password = $password;
    $this->connect();
  }

  private function connect(){
    $this->_connection = mysql_connect($this->host, $this->user, $this->password);
    if(!$this->_connection) {
      die("An error occured---- while connecting to the database: ".mysql_errno()." - ".mysql_error());
    } else{
      $selected = mysql_select_db($this->db, $this->_connection);
      if(!$selected) {
        die("An error occured while connecting to the database: ".mysql_errno()." - ".mysql_error());
      }
    } 
  }

  public function listing($sql) {
    $result = mysql_query($sql, $this->_connection);
    while($row=mysql_fetch_array($result)) {
      $return[] = $row;
    }
    return $return;
  }

  public function select($sql) {
    $result = mysql_query($sql, $this->_connection);
    return mysql_fetch_array($result);
  }

  public function insert($sql) {
    mysql_query($sql, $this->_connection);
    return mysql_affected_rows($this->_connection);
  }

  public function delete($sql) {
    mysql_query($sql, $this->_connection);
    return mysql_affected_rows($this->_connection);
  }

  public function escape($value) {
    return mysql_real_escape_string($value);
  }

}

?>

UPDATE 3
The error I get when replacing the thins suggested below

Notice: Undefined variable: _DB in /customers/***/***/httpd.www/belastingen/classes/btw.php on line 13 Fatal error: Call to a member function insert() on a non-object in /customers/***/***/httpd.www/belastingen/classes/btw.php on line 13
like image 336
Michiel Avatar asked May 11 '11 01:05

Michiel


2 Answers

As per our discussion in the comments on your question, try changing things up so that inc.php is required in btw.php; btw.php is required in index.php rather than inc.php; and 'btw.php` is not required in inc.php. From reading php.net/manual/en/function.include.php, I think this might have to do with scope.

EDIT:

First off, the setup you have creates a custom database object class (DBConnection) which is used to interface with the database and execute queries. When you used mysql_query by itself, it did not have a database connection identifier from which to execute the query, since the DBConnection object abstracts that functionality in object methods. That is why you needed to use if (!$_DB->insert($insert)).

Secondly, and I'm not 100% on this, but essentially core the problem seems to have to do with the code in btw.php not "seeing" the database setup code. This could have been because of two things. First, the $_DB variable was defined after the btw.php code was required, and as a result, when the PHP interpreter parsed btw.php, $_DB had not yet been defined. The order if the requires and the database object definition matter. Secondly, and this is where I am a bit unsure, but I think there is a variable scope/access issue when requiring btw.php from within inc.php (where $_DB is defined) rather than requiring the database setup within btw.php. In other words, you had the code that uses the database object required in the script that defines it, rather than the database setup script (including the database object declaration) required within the code that uses it.

I hope that makes sense, please let me know if it is still confusing. I tend to have a problem explaining things concisely.

like image 162
William Avatar answered Oct 02 '22 10:10

William


It doesn't seem that you are using your DBConnection class to make the query. Of course, it's in that class that the connection is made. By calling mysql_query() directly, PHP is using localhost, the web server account and no password when attempting the query. So you need to do something like

if($_DB->insert($insert) > 0)
{
     ...
like image 24
Steve Mallory Avatar answered Oct 02 '22 10:10

Steve Mallory