SQL MySQL Insert Join

ClocxHD

Lt. Junior Grade
Registriert
Aug. 2014
Beiträge
376
Hallo,

ich möchte etwas per Insert in eine Tabelle eintragen, jedoch benötige ich dafür Daten aus einer anderen Tabelle.

Mein derzeitiges Insert:
Code:
INSERT INTO news (`Title`, `Text`, `Author`, `Datum`) VALUES ($title, $text, author, $datum);

Meine Idee war es, das mit einem Join zu realisieren.
Aber das, was ich gefunden habe, schreibt alle Daten, die aus der anderen Tabelle zurück kommen, in die Tabelle.

Jedoch brauche ich aus der anderen Tabelle (user) nur den Author, der Rest ($title etc.) kommen per post aus einem
Formular.
Per post bekomme ich auch die ID vom Author aus Tabelle 2.

Wie realisiere ich das?

LG,
ClocxHD
 
Keine Ahnung ob es auch in einem Weg geht.

Jedoch würde erst abragen und danach ein Insert gehen.

PHP:
$query = "SELECT * FROM `User`  WHERE `id`= $_POST[id]";
$result = $mysqli->query($query);
if (!$result) {
    print $mysqli->error;
}
while ($daten = $result->fetch_object()) {

 $author= $daten->author;

    }

Danach dann das insert
 
Danke, das habe ich auch schon gefunden, aber wie trage ich dann noch die Sachen mit ein, die ich vom Formular bekomme?
 
Ich verweise mal auf Stackoverflow: http://stackoverflow.com/questions/5391344/insert-with-select

Du setzt im Query-String die Werte, die nicht aus der anderen Tabelle genommen werden soll, einfach "fest".
Bei dir wäre das dann:
INSERT INTO news (Title, Text, Author, Datum) SELECT $title, $text, author, $datum FROM user WHERE <Bedingung hier>;
Deine Daten aus dem Formular reichts du einfach per Variable ein. Das 'author' Feld aber nicht. Da kommt der Name des Feldes aus der Tabelle aus der selected wird rein (in dem Fall eben "author")

BTW: Gibts in PHP nicht die Möglichkeit mittels Parametern im Query-String zu arbeiten? Wäre sicherer bezüglich SQL-Injection
 
Zuletzt bearbeitet:
Ich verwende das Slim2-Framework, soweit ich weiß, ist das schon von grund auf gegen SQL Injection etc. geschützt.
Da ich mit dem Framework arbeite, sieht mein Syntax so aus:
PHP:
$app->post('/backend/news/eintragen', function () use ($app) {
    if (isset($_SESSION["Username"])) {
        //date_default_timezone_set('Europe/Berlin');
        $request = $app->request;
        $title = $request->post("title");
        $text = $request->post("text");
        $author = $request->post("author");
        //$datum = date("d.m.Y, H:i:s");
        $datum = "12.09.2015, 17:23:00";

        $update = $app->db->prepare("

          INSERT INTO news (Title, Text, Author, Datum) SELECT :title, :text, author, :datum FROM user WHERE ID = :author
        ");
        if($update->execute(["title" => $title, "text" => $text, "author" => $author, "datum" => $datum])){
            $app->redirect($app->urlFor("news.form"));
        } else {
            echo "Fehler";
        }
    } else {
        $app->redirect($app->urlFor('login.show'));
    }
})->name("news.eintragen");

Jedoch funktioniert es nicht, ich bekomme nur "Fehler" angezeigt.
 
Zunächst einmal sollten alle Bezeichner escapet werden, in MySQL geht das mit Backticks (`news`). Dann stehen im SELECT-Teil vorne plötzlich Parameter, gerade so, als ob der Spaltenname variabel wäre. Das sind natürlich Bezeichner und erst hinten im WHERE-Part kommen dann die Parameter. Dann kann es sein, dass in der Parameterbelegung statt "title" ein ":title" kommen muss, was aber je nach Umgebung mal so und mal so ist.

Ich sehe übrigens bei Slim2 nichts von nativer Datenbankunterstützung. Da hast du offenbar bereits eine externe Komponente zusätzlich in Nutzung. Falls das letztendlich PDO ist, bekommst du auf $update auch mehr Informationen als nur "Fehler": http://php.net/manual/de/pdostatement.errorinfo.php
 
Zuletzt bearbeitet:
Ja, ich verwende PDO.

Als Fehler bekomme ich folgendes zurück:
PHP:
Array ( [0] => 42S22 [1] => 1054 [2] => Unknown column 'author' in 'field list' )

Ich verstehe nicht so ganz, wo ich jetzt die Parameter hinpacken soll.
 
Zurück
Oben