Avatar billede hans01 Forsker
08. august 2016 - 06:10 Der er 17 kommentarer og
1 løsning

kan ikke hente data fra to tabeller ind med php

Jeg har disse to tabeller i min data base:

tbl_fysiske_servere som indeholder følgende:

ID, name, og timestamp

og

tbl_virtuelle_servere som indeholder følgende:

ID, name, samt fysiske_server_id

fysiske_server_id og fysiske_servere ID er ens..

For hver fysiske server har den en række virtueller servere tilknyttet.

nu er det jeg gerne vil kunne printe alle de fysiske servere ud med deres tilhørende virtuelle servere.

jeg har lavet en joint imellem de to tabeller

som ser sådan ud:

<?php

$sql = "SELECT * FROM tbl_fysiske_servere INNER JOINT tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere .fysiske_server_id ";
$result = mysql_query($sql);


?>

og resten af koden ser sådan ud:

<?php
    if(mysql_num_rows($result) > 0)
    {
        while($row = mysql_fetch_array($result))
        {
            ?>
        <?php echo $row["tbl_fysiske_servere.name"]; ?>
        <?php echo $row["tbl_virtuelle_servere.name+"];?>
        <?php }
       
    }
    ?>

jeg modtager dog denne fejl: Warning: mysql_num_rows() expects parameter 1 to be resource, boolean given in C:\wamp\www\drag-n-drop\index.php on line 185

linie 185 ser sådan ud: if(mysql_num_rows($result) > 0)

er der nogen der kan se hvad jeg gør galt?
Avatar billede Rune1983 Ekspert
08. august 2016 - 07:08 #1
Prøv denne SQL.
$sql = "SELECT * FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id";

Du havde JOINT og et mellemrum tbl_virtuelle_servere .fysiske_server_id
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 07:20 #2
hvorfor anvender du det gamle mysql API ??
jeg vil fårslå du anvender alias i din sql statement

JOINT er rettet af Rune1983

$sql = "SELECT tbl_fysiske_servere.name AS fysisk_server_name, tbl_virtuelle_servere.name AS virtuel_server_name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id";

dette 
<?php echo $row["tbl_fysiske_servere.name"]; ?>
<?php echo $row["tbl_virtuelle_servere.name+"];?> // hvad laver dette + ??


skal så være
<?php echo $row["fysisk_server_name"]; ?>
<?php echo $row["virtuel_server_name"];?>
Avatar billede hans01 Forsker
08. august 2016 - 07:35 #3
hej Ronols, det med pluset, så jeg lige selv.. det var en slåfejl..

dit script virker, jeg får dog ikke skrevet hele basen ud, kan du give mig et tips til at få alle informationer ud?
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 08:06 #4
hvad mener du med >jeg får dog ikke skrevet hele basen ud< ??
mener du alle felter  ?, så jo du får udskrevet de felter du selecter

connection.php

<?php
$mysqli = new mysqli("localhost", "root", "", "test");
if (!$mysqli) {
    echo 'Der opstod en fejl.';
    exit();
}
mysqli_set_charset($mysqli, "utf8");
// $mysqli->set_charset("utf8");
?>


denne udskriver hele databasen med det 2 selected felter

<?php
require("connection.php");
$sql = "SELECT tbl_fysiske_servere.name AS fysisk_server_name, tbl_virtuelle_servere.name AS virtuel_server_name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id";
$rs = mysqli_query($mysqli, $sql);
while($row = mysqli_fetch_assoc($rs)){
    echo $row['fysisk_server_name'];   
    echo " ";
    echo $row['virtuel_server_name'];
    echo "<br>";       
}
?>



$sql = "SELECT tbl_fysiske_servere.*, tbl_fysiske_servere.name AS fysisk_server_name, tbl_virtuelle_servere.name AS virtuel_server_name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id";


tbl_fysiske_servere.* = alle felter i tbl_fysiske_servere
jeg bruger ofte alias når jeg har felter der hedder det sammen i valgte tabeller
Avatar billede hans01 Forsker
08. august 2016 - 09:02 #5
hej ronols, hvis jeg tester din kode, så kommer der kun et felt ud?
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 09:46 #6
med dette dataset

CREATE TABLE `tbl_fysiske_servere` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

INSERT INTO `tbl_fysiske_servere` (`id`, `name`, `time_stamp`) VALUES
(1, 'indianerstammer', '2016-08-08 05:44:56'),
(2, 'helikoptere', '2016-08-08 05:44:56');

CREATE TABLE `tbl_virtuelle_servere` (
  `id` int(11) NOT NULL,
  `name` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `time_stamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  `fysiske_server_id` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;


INSERT INTO `tbl_virtuelle_servere` (`id`, `name`, `time_stamp`, `fysiske_server_id`) VALUES
(1, 'Apache', '2016-08-08 05:46:15', 2),
(2, 'Cherokee', '2016-08-08 05:46:15', 1),
(3, 'Comanche', '2016-08-08 05:46:46', 1),
(4, 'Navajo', '2016-08-08 05:46:46', 1),
(5, 'Seahawk', '2016-08-08 05:47:12', 2),
(6, 'Lynx', '2016-08-08 05:47:12', 2);


ALTER TABLE `tbl_fysiske_servere`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tbl_virtuelle_servere`
  ADD PRIMARY KEY (`id`);

ALTER TABLE `tbl_fysiske_servere`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=3;

ALTER TABLE `tbl_virtuelle_servere`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=7;



får jeg dette output

helikoptere Apache
indianerstammer Cherokee
indianerstammer Comanche
indianerstammer Navajo
helikoptere Seahawk
helikoptere Lynx


med den code vist i de grå boxe i #4
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 10:00 #7
du bør nok smide et ORDER BY på dit statement
$sql = "SELECT tbl_fysiske_servere.name AS fysisk_server_name, tbl_virtuelle_servere.name AS virtuel_server_name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id ORDER BY tbl_fysiske_servere.name";


så man får dette output

helikoptere Apache
helikoptere Seahawk
helikoptere Lynx
indianerstammer Cherokee
indianerstammer Comanche
indianerstammer Navajo
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 15:50 #8
som du kan se er min PHP code skrevet i mysqli (kunne også bruge PDO), hvilke jeg er "tvunget" til, da jeg anvender PHP 7.x, og der er det gamle mysql API fjernet.

en af nyskabelserne i mysqli, og forbedret i PDO er Prepare Statement, der giver størrer sikkerhed mod sql injection, og du vil i ovenstående code også kunne slippe for at bruge alias, da du navngiver din(e) output collonne(er) i din bind_result


<?php
require("connection.php");
$sql = "SELECT tbl_fysiske_servere.name, tbl_virtuelle_servere.name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id ORDER BY tbl_fysiske_servere.name";
if ($stmt = $mysqli->prepare($sql)) {
    /* Eksekver forespørgslen */
    $stmt->execute();
    /* Bind resultatet, og navngivning af output variable */
    $stmt->bind_result($fysisk_server_name, $virtuel_server_name);
    /* Hent rækker og udskriv data */
    while ($stmt->fetch()) {
        echo $fysisk_server_name;
        echo " ";
        echo $virtuel_server_name;
        echo "<br>";
    }
    $stmt->close();
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $conn->error;
}
?>


ref http://php.net/mysql_connect

Warning
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information.


http://php.net/manual/en/mysqlinfo.api.choosing.php

OleBole skrev tidligere en guide her på Eksperten,
kan nu pt findes på http://archive.org/web/
indtast addressen www.eksperten.dk/guide/1480 i søge feltet og vælg dato her april 13, 2016.
Avatar billede hans01 Forsker
08. august 2016 - 17:05 #9
Tak for hjælpen, som altid er prof.. Ville høre dig om man istedet for at vise output som: helikoptere Apache
helikoptere Seahawk
helikoptere Lynx
indianerstammer Cherokee
indianerstammer Comanche
indianerstammer Navajo

kunne få det se sådan ud:
helikoptere:
Apache
seahawk
Lynx

Indianerstammmer:
Cherokee
comanche
navaho
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 17:31 #10
>Ville høre dig om man istedet for at vise output som:
den hurtige løsning
der er kun ændret i din while


<?php
require("connection.php");
$sql = "SELECT tbl_fysiske_servere.name, tbl_virtuelle_servere.name FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id ORDER BY tbl_fysiske_servere.name";
if ($stmt = $mysqli->prepare($sql)) {
    /* Eksekver forespørgslen */
    $stmt->execute();
    /* Bind resultatet, og navngivning af output variable */
    $stmt->bind_result($fysisk_server_name, $virtuel_server_name);
    /* Hent rækker og udskriv data */
    $tmp="";
    while ($stmt->fetch()) {
        if($tmp != $fysisk_server_name){
            echo "<br>";
            $tmp = $fysisk_server_name;
            echo $fysisk_server_name;
            echo "<br>";
        }       
        echo $virtuel_server_name;
        echo "<br>";
    }

    $stmt->close();
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $conn->error;
}
?>


output

helikoptere
Apache
Seahawk
Lynx

indianerstammer
Cherokee
Comanche
Navajo
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 17:37 #11
en lille dum fejl:

echo 'Der opstod en fejl i erklæringen: ' . $conn->error;
skal være
echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;

memo til mig selv: hold dig til dine standart variabel navne, min connection hedder altid $conn
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 18:16 #12
du kunne også bruge GROUP_CONCAT(tbl_virtuelle_servere.name) med GROUP BY tbl_fysiske_servere.name

SELECT tbl_fysiske_servere.name, GROUP_CONCAT(tbl_virtuelle_servere.name) FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id GROUP BY tbl_fysiske_servere.name ORDER BY tbl_fysiske_servere.name

eller

SELECT tbl_fysiske_servere.name, GROUP_CONCAT(tbl_virtuelle_servere.name) AS virtuelle_servere FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id GROUP BY tbl_fysiske_servere.name ORDER BY tbl_fysiske_servere.name


også lave en explode på virtuelle_servere hvis du syntes det er pænere
Avatar billede olsensweb.dk Ekspert
08. august 2016 - 18:29 #13
det kunne se sådan ud:

<?php
require("connection.php");
$sql = "SELECT tbl_fysiske_servere.name, GROUP_CONCAT(tbl_virtuelle_servere.name) FROM tbl_fysiske_servere INNER JOIN tbl_virtuelle_servere ON tbl_fysiske_servere.id = tbl_virtuelle_servere.fysiske_server_id GROUP BY tbl_fysiske_servere.name ORDER BY tbl_fysiske_servere.name";
if ($stmt = $mysqli->prepare($sql)) {
    /* Eksekver forespørgslen */
    $stmt->execute();
    /* Bind resultatet, og navngivning af output variable */
    $stmt->bind_result($fysisk_server_name, $virtuel_server_name);
    /* Hent rækker og udskriv data */
   
    while ($stmt->fetch()) {       
        echo "<br>";
        echo $fysisk_server_name;       
        $ar = explode(",", $virtuel_server_name);
        for($i=0, $lng=count($ar); $i<$lng; $i++){
            echo "<br>";
            echo $ar[$i];                   
        }
        echo "<br>";
    }
    $stmt->close();
} else {
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}
?>
Avatar billede hans01 Forsker
09. august 2016 - 05:41 #14
God morgen Ronols, jeg er igang med at teste dit forslag og alt virker fint, jeg forstår så ikke så meget af det endnu.. men jeg prøver stille og roligt..

jeg ville lige høre endnu en ting,

jeg får kun skrevet de fysiske servere ud, hvis der er tilknyttet en virtuel server, er der en måde så jeg kan få udskrevet alle de fysiske servere, selvom der ingen virtuelle servere er dedikeret endnu?

min ide med det hele, dvs det jeg mangler endnu, er jeg vil kunne flytte de virtuelle servere imellem de fysiske som drag n drop. med en samtidig opdatering i databasen..
Avatar billede olsensweb.dk Ekspert
09. august 2016 - 06:19 #15
>så jeg kan få udskrevet alle de fysiske servere, selvom der ingen virtuelle servere er dedikeret endnu?
ja simpelt: kig på LEFT JOIN eller RIGHR JOIN istedet for INNER JOIN
http://dev.mysql.com/doc/refman/5.7/en/left-join-optimization.html
http://www.w3schools.com/sql/sql_join_left.asp


>er jeg vil kunne flytte de virtuelle servere imellem de fysiske som drag n drop
her skal du lave noget javascript, og vha AJAX kører dit sql kald


lad og sige du flytter Apache fra helikoptere til indianerstammer er det bare at kører denne sql
UPDATE tbl_virtuelle_servere SET fysiske_server_id = 1 WHERE id = 1


http://www.w3schools.com/html/html5_draganddrop.asp
http://www.html5rocks.com/en/tutorials/dnd/basics/
https://developer.mozilla.org/en-US/docs/Web/API/HTML_Drag_and_Drop_API

http://www.udvikleren.dk/artikler/374/dynamisk-indhold-med-ajax-og-php/
Avatar billede hans01 Forsker
10. august 2016 - 03:29 #16
God morgen, så er jeg igang med at opdatere databasen efter jeg har flyttet rundt på de virtuelle servere, her er jeg gået i stå.. Hvordan får jeg informeret databasen om ændringerne?

jeg har lavet dette java script:

function update(){
 
    $.ajax({
        type:'POST',
        url:'update.php',
        data:{data:data},
        success: function(){
            alert('Updated');
        }
    });
}

herefter har jeg oprette en ny side update.php

med følgende indhold:

<?php require_once('Connections/test.php'); ?>
<?php
    $data  =  $_POST['data'];
 
?>
Avatar billede olsensweb.dk Ekspert
10. august 2016 - 08:03 #17
det her er ved at udvikle sig til et evigheds spørgsmål, og væk fra det det oprindelige spørgsmål.

det bliver svært at bruge dette som videns database, hvis emnet skifter, og der kommer ikke nye personer ind i en tråd der er så lang som denne.

opret et nyt spørgsmål så andre kan bidrage.
Avatar billede hans01 Forsker
10. august 2016 - 09:11 #18
Hej Ronols

Du har ret, jeg lukker sp.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester