2016-07-03 7 views
3

Ich habe eine LEFT JOIN gemacht, um die Werte aus 2 Tabellen aus meiner Datenbank zu bekommen.
Die Abfrage ist wie folgt aus:Wie wählt man eine Spalte in einem linken Join aus, wenn es zwei Spalten mit demselben Namen gibt? [MySql]

SELECT * 
FROM thread 
    LEFT JOIN comments ON thread.id_thread = comments.id_thread 
WHERE id_type = '1' 
ORDER BY data DESC, hour DESC 

Dann habe ich auf diese Weise die Werte Ausgabe:

<? 

while($row = mysqli_fetch_array($query)) 
{ 
echo '<div class="col-md-1"></div>'; 
echo '<div class="col-md-11">'; 
echo $row['title'] ."<br><br>".$row['content']."<br><br>"; 
echo $row['content_com']; 
echo '<div class="col-md-2 pull-right">'. "date: ".$row['data']."<br>"."author: ".'<a href ="/user.php?id='.$row['username'].'">'.$row['username'].'</a>'.'</div>' ."<br><br>"; 
echo '<form role="form" action="commit.php" method="post"><div class="col-md-offset-1 col-md-9"><input class="form-control" type="text" name="comm"><input type="hidden" name="thread_id" value="'.$row['id_thread'].'"></div></form> <br><br><hr><br>'; 
echo '</div>'; 
} 

mysqli_close($connect); 
?> 

Dann in der commit.php (form action):

<?php 
session_start(); 

    if(isset($_SESSION['id'])) 
    { 
    $servername = "mysql9.000webhost.com"; 
    $username = "a5461665_admin"; 
    $password = "xenovia1"; 
    $dbname = "a5461665_pap"; 

    $connect = mysqli_connect($servername, $username, $password, $dbname); 

    $id = (isset($_GET['id'])) ? $_GET['id'] : $_SESSION['id']; 

    $ctn = $_POST["comm"]; 

     $com = mysqli_query($connect,"INSERT INTO comments(content_com,id_thread) values ('".$ctn."', '".$_POST['thread_id']."')"); 

     header("location:javascript://history.go(-1)"); 


    if (!$connect) { 
     die("Connection failed: " . mysqli_connect_error()); 
    } 

} 
else 
{ 
    header(" url=index.php"); 
} 


?> 

Mein Problem ist, dass das versteckte Eingabefeld an die Formularaktion das Feld id_thread aus der Tabelle comments übergibt, aber ich möchte, dass es das fie passiert ld id_thread aus der Tabelle threads, wie mache ich das ??

+2

Sie breit [SQL Injections] geöffnet sind (http://php.net/manual/en/security.database.sql -injektion.php). Da Sie MySQLi verwenden, sollten Sie in [Prepared Statements] (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) –

Antwort

5
SELECT *, thread.id_thread as mycol 
FROM 
thread LEFT JOIN comments 
ON thread.id_thread=comments.id_thread 
WHERE thread.id_type = '1' 
ORDER BY data desc, hour desc 

Geben Sie den Spaltennamen mit der Tabelle an und aliasieren Sie ihn. So, SELECT * für alle Spalten wie zuvor, jetzt unter thread.id_thread und alias es zu . Dies wird jetzt als und keine mehr-Namen-Kollision verfügbar sein.

+0

schauen, beide Tabellen haben das Feld id_thread, aber ich möchte das thread -> id_thread und es gibt mir Kommentare -> id_thread – kraven2g

+0

@ kraven2g ok..editing – Iceman

+0

@ kraven2g - Zunächst einmal sollten Sie nicht 'SELECT * FROM ...' verwenden ... Sie sollten angeben, welche Spalten Sie wollen. Wenn zwei Spalten denselben Namen haben, verwenden Sie das Schlüsselwort 'AS', wie zum Beispiel:' SELECT table1.col1, table1.col2 ..., table2.col1 AS col1_2 ... 'und so weiter. –

1

Sie „alias“ oder den Tabellennamen verwenden können - dann angeben, welche Spalte Sie

SELECT T.*, comments.id_thread AS comment_thread_id 
FROM thread T 
LEFT JOIN comments 
    ON thread.id_thread=comments.id_thread 
WHERE id_type = '1' ORDER BY data desc, hour desc 

sehen, T ist alis für Tabellennamen, Gewinde verwenden möchten, T.* alle Spalten aus thread Tabelle auswählen, comments.id_thread dauert nur Spalten-ID aus der Tabelle comments genannt als comment_thread_id

1

Neben verwenden Aliase/name Sie auch USING() statt ON, um die Tabellen verknüpfen können.

SELECT T.*, comments.id_thread AS comment_thread_id 
FROM thread T 
LEFT JOIN comments 
    USING(id_thread) 
WHERE id_type = '1' ORDER BY data desc, hour desc 

Hier ist eine schöne Erklärung für den Unterschied zwischen den beiden Methoden: https://stackoverflow.com/a/11367066/3595565