Array to string conversion - Fehler bei schreiben in die Datenbank

mik3_1802

Grünschnabel
Guten Abend,

ich bin gerade dabei PHP zu lernen, und habe jetzt mal versucht einen Code für Umfragen zu schreiben.

Jetzt stehe ich vor einem kleinen Problem, und zwar will ich aus einem Eingabefeld den Namen für die neue Umfrage abfragen, und dann eine neue Tabelle nach dem eingegebenem benennen.

Klappt eigentlich auch, nur das ich dann den Fehler, bzw den Hinweis

Notice: Array to string conversion in C:\xampp\htdocs\Umfragen\classes\db_class.php on line 18

bekomme.

Es wird dann sogar eine neue Tabelle angelegt mit den Spalten die ich haben wollte, nur das der Name der Tabelle nicht Beispiel sondern 'Beispiel' ist. Das bekomme ich einfach nicht weg. Ich vermute mal das hat was mit dem Hinweis zu tun.

Jetzt erstmal zu dem Code vom Layout:
PHP:
<?php
$showformeingabe = true;
require_once("proc/neue_umfrage.php");

if($showformeingabe) {
?>
<form action="" method="post">
    Wie viele Eingabefelder (Reihen) brauchen sie?
    <br />
    <input type="text" name="rows" />
    <br />
    <input type="submit" value="Tabelle erstellen" name="submit" />
</form>
<?php } ?>

Und die Eingaben kommen dann hier in der Datei an:
PHP:
<?php
$umfrage = new umfragen;
$reihe = null;
if(isset($_POST['submit'])) {
    $anzahl = $_POST['rows'];
    $reihe = 1;
    echo '<form action="" method="post">';
    echo "Name der Umfrage:<br>";
    echo '<input type="text" name="umfragename"><br><br>';
    echo "<p>Objekte            Anzahl</p><br>";
    while($anzahl > 0) {
        if($anzahl == 0) {
            break;
        }
        echo '<input type="text" name="objekt' . $reihe . '"> <input type="text" size="5" name="anzahl' . $reihe . '"><br>';
        $anzahl -= 1;
        $reihe += 1;
    }
    echo '<input type="submit" name="erstellen" value="Umfrage erstellen">';
    echo '</form>';
    $showformeingabe = false;
}

if(isset($_POST['erstellen'])) {
    $ergebnis = null;
    $umfragename = $_POST['umfragename'];
    $umfrage->db->set_umfrage($_POST['umfragename']);
    $row = 1;
    while($row < $reihe) {
        $objekt = $_POST['objekt' . $row];
        $fanzahl = $_POST['anzahl' . $row];
        if(!strlen($objekt or $fanzahl) == 0) {
            $ergebnis = ($umfrage->db->insert_neue_umfrage($umfragename, $objekt, $fanzahl));
        }
        if($row == $reihe) {
            break;
        }
        $row += 1;
    }
    if($ergebnis) {
        echo "Tabelle erfolgreich angelegt.";
    } else {
        echo "Es ist ein Fehler aufgetreten.";
    }
}
?>

Und das hier ist die Code mit den Funktionen auf die zugegriffen wird:
PHP:
<?php

/**
 * db_class short summary.
 *
 * db_class description.
 *
 * @version 1.0
 * @author Mike
 */
class db_class extends PDO
{
    public function set_umfrage($umfragename) {
        $umfragename1 = $umfragename;
        $statement = $this->prepare("CREATE TABLE `umfragen`.`:umfragename` ( `id` INT NOT NULL AUTO_INCREMENT , `objekt` TEXT NOT NULL , `ersteller` BOOLEAN NULL , `anzahl` INT NOT NULL , PRIMARY KEY (`id`)) ENGINE = InnoDB;");
        $statement->bindParam("umfragename", $umfragename1, PDO::PARAM_STR);
        $statement->execute();
        echo ($statement->errorInfo());
        return $statement->fetch();
    }

    public function insert_neue_umfrage ($umfragename, $objekte, $anzahl) {
        $statement = $this->prepare("INSERT INTO :umfragename (objekt anzahl, ersteller) VALUES (:objekte, :anzahl, 1)");
        $statement->execute(array('umfragename' => $umfragename, 'objekte' => $objekte, 'anzahl' => $anzahl));
        echo ($statement->errorInfo());
        return $statement->fetch();
    }

    public function get_umfrage($umfragename) {
        $statement = $this->prepare("SELECT * FROM :umfragename");
        $statement->bindParam('umfragename', $umfragename, PDO::PARAM_STR);
        echo ($statement->errorInfo());
        return $statement->fetch();
    }

    public function check_umfrage($umfragename) {
        $statement = $this->prepare("SELECT id FROM :umfragename WHERE id = 1");
        $statement->execute(array('umfragename' => $umfragename));
        echo ($statement->errorInfo());
        return $statement->fetch();
    }
}

?>

Und achja ab dem Punkt wo der Hinweis kommt, läuft das auch nicht mehr weiter. Also das die eingegebenen Daten in die neue Tabelle übertragen werden.


Ich hoffe das mir jemand weiterhelfen, und vor allem das ich was neues dazu lernen kann! :)
Würde mich auch über Verbesserungsvorschläge freuen, was man besser machen kann. Bin mir sicher das man vieles das ich geschrieben habe besser machen, oder wenn es falsch ist sogar richtig machen kann :D
Bin mir noch etwas unsicher wann ich ich was, und wie ich es anwenden kann.

Danke im Voraus für hilfreiche Antworten! :)
 
Hi

ich bin mir nicht sicher, ob prepare usw. überhaupt mit variablen Tabellennamen umgehen können "soll". Variable Werte usw. ja, aber Tabellennamen... und außerdem schreit es nur so nach langfristigen Problemen, je nach Bedarf mehrere (beliebig viele) Tabellen für den selben Zweck anzulegen.

Wie wäre eine Tabelle mit den Spalten UmfrageID und UmfrageName (oder so ähnlich eben), und eine Tabelle mit Spalten ähnlich zu den jetzigen Tabellen, aber mit einer zusätzlichen Spalte UmfrageID (also um zusammengehörende Zeilen der selben Umfrage zuzordnen)? Also gesamt nur zwei Tabellen, die Abfragen etwas ändern, und das Problem mit den '' sollte sich durch fixe Tabellennamen auch lösen.

Zu anderen Verbesserungsvorschlägen fällt mir derzeit nicht viel ein... nach dem CreateTable ein fetch() ist etwas seltsam, und as echo darüber ist vermutlich nur für Testzwecke (?)
 
Hab am Anfang überlegen müssen ob für jede Umfrage eine Tabelle, oder so wie du es jetzt beschrieben hast. Dachte jeweils ne Tabelle wäre besser, aber wie man sieht hast du wohl Recht damit dass es anders besser ist.

Zu anderen Verbesserungsvorschlägen fällt mir derzeit nicht viel ein... nach dem CreateTable ein fetch() ist etwas seltsam, und as echo darüber ist vermutlich nur für Testzwecke (?)

Dachte das fetch wäre richtig:rolleyes:.. Aber wenn das nichts da zu suchen hat, nehm ich's raus.

Ja das echo ist nur für Testzwecke, weil erst nichts passiert ist. Und da wollte ich wissen was mir da so für Fehler ausgespuckt werden :D
 
Zurück