Haumis wbb hilfe (http://haumis-wbb-hilfe.de/wbb2/index.php)
- ...:::Trainingscenter-wbb2:::... (http://haumis-wbb-hilfe.de/wbb2/board.php?boardid=75)
-- php (http://haumis-wbb-hilfe.de/wbb2/board.php?boardid=80)
--- DB-Abfrage mit mehr als einem Ergebnis mit VerbundDB (http://haumis-wbb-hilfe.de/wbb2/thread.php?threadid=3131)


Geschrieben von Hangasilly am 13.06.2019 um 20:39:

  DB-Abfrage mit mehr als einem Ergebnis mit VerbundDB

Hey, ich hab da mal ncohmal ne kleine Problematik, die es zu lösen gilt.... - vllt habt ihr ja ne Idee?!? :)

Es geht um ein Script, das auf 2 DB-Tables zugreifen soll. In einer Tabelle steht der Deutsche Name, der gesucht wird, hier hole ich mir dann den Namen (den Suchbegriff + Platzhalter) und die ID raus.
Nur greif ich die ID auf, und suche damit in meiner 2. Tabelle nach der Disply-ID, welche ich dann auch auslese.

Mein Code sieht so aus:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
$item_tbl_search = "SELECT * FROM  item_template_locale WHERE Name LIKE '"."%".$itembezeich."%"."' "; 

$item_tbl_search_out = mysql_query($item_tbl_search);
while ($ds = mysql_fetch_object($item_tbl_search_out)) {
		$id = $ds->ID;
		$itemname = $ds->Name;
		
	eval ("\$itemsearchout .= "".$tpl->get("itemsearch_out")."";"); 
	}

//ItemID-Suche in ID-Tabelle
$item_tbl_id_search = "SELECT * FROM  item_template WHERE entry LIKE '".$id."' "; 

$item_tbl_id_search_out = mysql_query($item_tbl_id_search);
while ($ds = mysql_fetch_object($item_tbl_id_search_out)) {
		$disply_id = $ds->displayid;
		
		eval ("\$itemsearchout .= "".$tpl->get("itemsearch_out")."";"); 
	}



Hier holt er mir nun alle zu dem Suchbegriff passenden Namen aus der ersten Tabelle und listet diese auf - was ja auch so gewollt ist, leider übergibt er aber nur die letzte ID, die er findet und darum zeigt er mir später in miner Tabelle in der 'Namen'-Spalte zwar alle Sachen an, in der 'ID'-Spalte wird aber nur die letzte Zeile gefüllt. Das ist natürlich blöd.

Wie krieg ich die IDs aus der ersten Tabelle also in ein Array verpackt, und dieses dann aus der 2. Tabelle komplett ausgelesen, sodass ich für jeden Eintrag "$itemname" in meiner Ausgabetabelle auch die dazu passende dispalyID aus der 2. Tabelle bekomme (oder geht das überhaupt mim Array?!?)



Geschrieben von haumi am 14.06.2019 um 15:56:

 

Ich kann das jetzt nicht nachvollziehen.

Versuche aber mal bei
$disply_id = $ds->displayid;
einen Punkt vor das Gleichheitszeichen zu setzen.
das soll denn so aussehen:
$disply_id .= $ds->displayid;

Ansonsten muss ich mir das mal im Testboard aufbauen.

LG
haumi



Geschrieben von Hangasilly am 19.06.2019 um 01:41:

 

Hey,

so ich bin mal dazu gekommen das auszuprobieren, klappt aber leider nicht...

zum nachvollziehen hier mal das komplette script:
die PHP:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
<?php

$filename="item_search.php";
require("global.php");
require("acp/lib/class_parse.php");



//IF Suche
if(isset($_POST['action']) == "itemsearch"){
$itembezeich = $_POST[Itemname];

$itemsuche=1;

//Itemsuche in Tabelle
$item_tbl_search = "SELECT * FROM  item_template_locale WHERE Name LIKE '"."%".$itembezeich."%"."' "; 

$item_tbl_search_out = mysql_query($item_tbl_search);
while ($ds = mysql_fetch_object($item_tbl_search_out)) {
		$id = $ds->ID;
		$itemnameDE = $ds->Name;
		
//		eval ("\$itemsearchout .= "".$tpl->get("itemsearch_out")."";"); 
	}

//ItemID-Suche in ID-Tabelle
$item_tbl_id_search = "SELECT * FROM  item_template WHERE entry LIKE '".$id."' "; 

$item_tbl_id_search_out = mysql_query($item_tbl_id_search);
while ($ds = mysql_fetch_object($item_tbl_id_search_out)) {
		$disply_id.=$ds->displayid;
		$itemname = $itemnameDE;
		eval ("\$itemsearchout .= "".$tpl->get("itemsearch_out")."";"); 
	}


}else{
$itemsuche=0;
$itembezeich = "suchst du nix";
}



if($fehler !="") {
	echo "<SCRIPT>
	alert('$fehler');
	</SCRIPT>";
}

eval("\$tpl->output("".$tpl->get("itemsearch")."");");

?>




die 1. tpl >> itemserach<<:
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
69:
70:
71:
72:
73:
<?xml version="1.0" encoding="{$lang->items['LANG_GLOBAL_ENCODING']}"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="{$lang->items['LANG_GLOBAL_DIRECTION']}" lang="{$lang->items['LANG_GLOBAL_LANGCODE']}" xml:lang="{$lang->items['LANG_GLOBAL_LANGCODE']}">
<head>
<title>$master_board_name | {$lang->items['LANG_FAQ_FAQ']}</title>
$headinclude
</head>

<body>
$header
<table cellpadding="{$style['tableincellpadding']}" cellspacing="{$style['tableincellspacing']}" border="{$style['tableinborder']}" style="width:{$style['tableinwidth']}" class="tableinborder">
<tr>
<td class="tablea"><table cellpadding="0" cellspacing="0" border="0" style="width:100%">
<tr class="tablea_fc">
<td align="left"><span class="smallfont"><b><a href="index.php{$SID_ARG_1ST}">$master_board_name</a> &raquo;
Corelith Item-Suche&nbsp;&nbsp;&nbsp; </b></span></td>
<td align="right"><span class="smallfont"><b>$usercbar</b></span></td>
</tr>
</table></td>
</tr>
</table><br />
<table cellpadding="{$style['tableincellpadding']}" cellspacing="{$style['tableincellspacing']}" border="{$style['tableinborder']}" style="width:{$style['tableinwidth']}" class="tableinborder">

<td align="center" class="tablecat" colspan="1"><span class="normalfont"><font color="00b3fe" size=4><u>Corelith Item-ID-Suche</u><font></span></td>


<tr align="left">
<td class="tableb" style="width:100%"><span class="normalfont">
<center>
<br>
<br>
Hier könnt ihr den Namen eines Items des Corelith-Servers angeben, um die ID des betreffenden Items herauszufinden.<br>
<br>
<form accept-charset="UTF-8" method="POST" action="item_search.php">
<input type="hidden" name="action" value="itemsearch">

<table border=1 bordercolordark=#00b3fe bordercolorlight=#ffffff width="40%">
  <tr>
    <th width="15%"><font size="2">Item-Name:</font></th>
<td width="25%" align="center"><input type="text" placeholder="Item" name="Itemname" size="25"></td>
  </tr>
</table>
<br>
<input type="submit" value="Suchen" name="itemsearch">
<br><br>
</form>
$itemsuche<br>
test<br>
$itembezeich<br><br>

<if($itemsuche=="1")><then>
<center>Deine Suche ergabe folgende Funde:</center><br /><br />
<table border=1 bordercolordark=#00b3fe bordercolorlight=#ffffff width="40%">
<tr>
<colgroup width="300" height="60" span="">
<!-- <th><b><font size="3">Listennummer</font></b></th> -->
<th><b><font size="3">Item</font></b></th>
<th><b><font size="3">ID</font></b></th>
</colgroup>
</tr>
$itemsearchout
</table>
<br />

</then></if><br /><br />

</center>
</span></td>
</tr>
</table>
$footer
</body>
</html>



und die 2. TPL >>itemserach_out<<:
code:
1:
2:
3:
4:
5:
 <tr>
<!--    <td width="18%" align="center">$id</td>  -->
    <td width="18%" align="center">$itemname</td>
    <td width="17%" align="center">$disply_id</td>
  </tr>




Geschrieben von haumi am 24.06.2019 um 16:12:

 

Versuche mal

code:
1:
2:
3:
4:
5:
6:
$item_tbl_search = "SELECT * FROM  item_template_locale WHERE Name LIKE '"."%".$itembezeich."%"."' ";

$item_tbl_search_out = mysql_query($item_tbl_search);
while ($ds = mysql_fetch_object($item_tbl_search_out)) {
        $id = $ds->ID;
        $itemname = $ds->Name;


durch
code:
1:
2:
3:
4:
5:
6:
7:
8:
$stmt = $dbi->prepare("SELECT ID, Name FROM  item_template_locale WHERE Name LIKE '"."%".$itembezeich."%"."'");
            $stmt->execute();
            $stmt->bind_result($ID, $Name );

                    while($stmt->fetch()) {

                     $id = $ID;
                    $itemname = $Name;


zu ersetzen.
wird dann denn immer noch nur das letze Ergebnis angezeigt,
dann ersetze mal
code:
1:
2:
$id = $ID;                    
$itemname = $Name;


durch
code:
1:
2:
$id .= $ID
$itemname .= $Name;



ersetze in der global.php
die Zeile:
code:
1:
$db = new db($sqlhost, $sqluser, $sqlpassword, $sqldb, $phpversion);


durch:
code:
1:
2:
$dbi=mysqli_connect("$sqlhost",$sqluser,$sqlpassword,$sqldb);    // prozedualer Zugriff
$db = new db($sqlhost, $sqluser, $sqlpassword, $sqldb, $phpversion);  // objektorientierter Zugriff



LG
haumi



Geschrieben von Hangasilly am 26.06.2019 um 09:11:

 

Hey,
erstmal Danke für die Mühe! Allerdings:

mit dem "Punkt" :
code:
1:
2:
$id .= $ID;
$itemname .= $Name;



zeigt er mir garnix mehr an nach der Suche als Ergebnis.
Ohne die Änderung mit dem "Punkt" zeigt er keine Itemnamen mehr an und NURNOCH die letzte ID, die er findet...

Klappt also leider noch nicht so ganz nun^^



Geschrieben von haumi am 26.06.2019 um 15:39:

 

Ich habe jetzt mal folgenden Code genommen!
code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
<?php

require('./global.php');
 $neu = array();
 $stmt = $dbi->prepare("SELECT id_fragen , desc_frage FROM bb1_burg_fragen ORDER BY id_fragen ASC ");
$stmt->execute();
$stmt->bind_result($id_fragen , $desc_frage );
                    while($stmt->fetch()) {
echo $id_fragen;
echo $desc_frage;
echo "<br>";
}
?>


und habe folgendes Ergebnis bekommen (es ist nur ein Ausschnitt!)


Vielleicht hilft dir das weiter?

LG
haumi



Geschrieben von Hangasilly am 29.06.2019 um 21:23:

 

Hmmmmm..

Du holst die Daten da alle aus 1 DB, das geht ja ohne Weiteres... Mein Problem is die Verbindug:

Alles was nach dem Suchbegriff klingt aus der einen DB, davon je die ID, und dann jede ID aus der zweiten DB die passenden Daten. Als Ausgabe jeder Name, der dem Suchbegriff ähnelt aus DB1 mit den dazu passenden Daten aus DB2...
Und da wird eben nicht jede ID (die eben das Verbindungsglied in beiden DBs ist) genommen, sondern nur die letzte und damit dann aus DB2 die Daten (displayID) rausgenommen und ausgegeben....



Geschrieben von haumi am 30.06.2019 um 14:02:

 

Ich denke mal das du eine Art Join-Verbindung aufbauen möchtest.

Da habe ich im Internet folgendes gefunden:

Kann man mit JOIN auch 2 Tabellen aus 2 verschiedenen MYSQL-Datenbanken verknüpfen ?

Ja, man kann, wenn der angemeldete User Rechte auf beiden Datenbanken besitzt und diese auf einem MySQL-Server liegen

Zugriff:
datenbankname.tabellenname
im ON-Teil: datenbankname.tabellenname.feldname

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
<?php
    mysql_connect("server" , "user" , "pass") or die(mysql_error());
    $res = mysql_query("select *
                        from db1.tab1
                        join db2.tab2
                          on db1.tab1.pk=db2.tab2.fk") or die(mysql_error());
    while ($row=mysql_fetch_assoc($res)) {
        print_r($row);
    }
?>



pk und fk steht für die Tabellenverknüpfung
pk = primary key
fk = foreign key

https://www.tutorials.de/threads/join-ueber-zwei-datenbanken.237973/

Ist es das was du suchst?

LG
haumi



Geschrieben von Hangasilly am 30.06.2019 um 23:31:

 

Hey, ja, das mit dem JOIN sieht ganz interessant aus...

Ich werd das bei nächster Gelegenheit mal versuchen und Rückmeldung geben....



Geschrieben von Hangasilly am 02.07.2019 um 20:22:

 

So... das Join funktioniert !!!
Habs nun wie folgt gelöst:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
$item_tbl_search = "SELECT item_template_locale.name AS name, item_template.displayid AS displayid
					FROM item_template_locale 
                                        JOIN item_template 
					ON item_template_locale.ID = item_template.entry 
					WHERE item_template_locale.name LIKE '"."%".$itembezeich."%"."' ";

$item_tbl_search_out = mysql_query($item_tbl_search);
while ($ds = mysql_fetch_object($item_tbl_search_out)) {
		$disply_id = $ds->displayid;
		$itemname = $ds->name;
		
			eval ("\$itemsearchout .= "".$tpl->get("itemsearch_out")."";"); 
}



^^besten Dank für die ganze Unterstützung Haumi


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH