2016-07-30 10 views
0

Ich habe eine Datei namens chat.php mit einem Namespace MyApp und versuche, eine Verbindung zur Datenbank mit PDO und fügen Sie einige Daten, aber in meiner IDE bekomme ich eine Fehlermeldung Methode Ausführen nicht gefunden. Wo gehe ich falsch?PDO Ausführen nicht gefunden Fehler in PHP Sturm

Im Folgenden sind einige Teile des Codes:

<?php 

namespace MyApp; 

use Ratchet\MessageComponentInterface; 
use Ratchet\ConnectionInterface; 
use Emojione\Client; 
use Emojione\Ruleset; 
use \PDO; 
use \PDOException; 

class Chat implements MessageComponentInterface { 
protected $clients; 
/** 
* @var \Emojione\Client 
*/ 
private $emojioneClient; 

public function __construct() { 
    $this->clients = new \SplObjectStorage; 
    /** 
    * Following for setting up conversion and display of native and ascii emojis 
    */ 
    $this->emojioneClient = new Client(new Ruleset()); 
    $this->emojioneClient->imageType = 'png'; 
    $this->emojioneClient->imagePathPNG = './assets/png/'; 
    $this->emojioneClient->ascii = true; 

    $this->connect(); 
} 
. 
. 
. 
. 
. 

public function connect() { 
    $hostname='localhost'; 
    $dbname = 'cryptoIM'; 
    $username='root'; 
    $password=''; 

    try { 
     $dbh = new PDO("mysql:host=$hostname; dbname=$dbname", $username, $password); 

     $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     echo 'Connected to Database<br/>'; 
    } 
    catch(PDOException $e) 
    { 
     echo ('ERROR: ' . $e->getMessage()); 
    } 
} 

public function insertData() { 
    $query = $dbh->prepare("INSERT INTO inbox(users, message, attachmentURI, timestamps) VALUES (:username, :messagetxt, :attachmentURI, :unixtime)"); 
    $query->execute(array(
     "username" => "", 
     "messagetxt" => "", 
     "attachmentURI" => "", 
     "unixtime" => "" 
    )); 
} 
+0

Try '$ this-> dbh = new PDO (" mysql: hos .... '' dann verwenden $ this-> dbh 'nicht' $ dbh'! –

+0

Sie sollten den Fehler bei '$ dbh-> prepare' bekommen, da es außerhalb des Gültigkeitsbereichs für die Funktion liegt .. –

+0

@JeffPuckettII Bei der Vorbereitung bekomme ich keine Datenquellen konfiguriert sind, diese SQL auszuführen und bereitzustellen. ... – Ayan

Antwort

1

Offenbar ist $dbh in insertData() Umfang nicht zur Verfügung. Versuchen Sie, $dbh zu $this (Klassenbereich) hinzuzufügen, und Sie müssen : Doppelpunkte Ihren execute() Array-Schlüssel hinzufügen.

class Chat implements MessageComponentInterface { 
    protected $clients; 
    protected $dbh; 

dann:

public function connect() { 
    //...  
    try { 
     $this->dbh = new PDO("mysql:host=$hostname; dbname=$dbname", $username, $password); 

     $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
     echo 'Connected to Database<br/>'; 
    } 
    catch(PDOException $e) 
    { 
     echo ('ERROR: ' . $e->getMessage()); 
    } 
} 

dann:

public function insertData() { 
    $query = $this->dbh->prepare("INSERT INTO inbox(users, message, attachmentURI, timestamps) VALUES (:username, :messagetxt, :attachmentURI, :unixtime)"); 
    $query->execute(array(
     ":username" => "", //Don't forget to add colons ':' 
     ":messagetxt" => "", 
     ":attachmentURI" => "", 
     ":unixtime" => "" 
    )); 
} 

Über den Fehler Execute-Methode nicht gefunden. Ich denke, Sie müssen Aufruf an eine Member-Funktion auf einem Nicht-Objekt oder etwas ähnliches!

+0

Wenn du mir ein Beispiel zeigen könntest, was du für die letzte Para bedeutest, wäre es hilfreich, weil der Fehler nicht weg ist – Ayan

+0

Eine zusätzliche Notiz: Ich kann sehen, dass du 'MessageCo benutzt mponentInterface' ist diese Schnittstelle hat alle Methoden, die Sie implementieren sollten !! –

+0

Ja, es hat Methoden, die implementiert ist. Ich habe meinen Code entsprechend Ihrer Antwort aktualisiert, aber ich habe immer noch dieses Highlight. Wird es in Zukunft einen wesentlichen Fehler geben? – Ayan

1

Da Sie dieses Objekt in verschiedenen Funktionen in Ihrer Klasse verwenden möchten, müssen Sie es als private Klassenvariable deklarieren.

class Chat implements MessageComponentInterface { 
protected $clients; 
private $dbh; 

initialisieren Dann ist es in Aufruf Ihrem Konstruktor zu connect.

try { 
    $this->dbh = new PDO("mysql:host=$hostname; dbname=$dbname", $username, $password); 

    $this->dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 
    echo 'Connected to Database<br/>'; 
} 

Und verweisen auf die Klasse Eigenschaft als solche an anderer Stelle:

public function insertData() { 
    $query = $this->dbh->prepare("INSERT INTO inbox(users, message, attachmentURI, timestamps) VALUES (:username, :messagetxt, :attachmentURI, :unixtime)");