records uit database lezen, vervolgen tonen op het internet

Status
Niet open voor verdere reacties.

jelleruben

Gebruiker
Lid geworden
11 nov 2006
Berichten
435
Hallo allemaal,

Ik heb een SQL database waar gegevens instaan die ik op een internet pagina getoond wil hebben.

Ik heb eerst mijn SQL statement gemaakt, de heb ik getest en lijkt te werken.

[sql]
SELECT
taken.taken_id AS ID,
taken.taken_datum AS Datum,
takenlijst.takenlijst_item AS Activiteit,
taken.taken_functie AS Functie,
taken.taken_bedrijf AS Bedrijf,
taken.taken_contactpersoon AS Contactpersoon,
status.status_omschrijving AS Status

FROM

taken, takenlijst, status

WHERE

taken.taken_activiteit = takenlijst.takenlijst_id and
taken.taken_ingevoerd = 1 and
taken.taken_status = status.status_id
[/sql]

Nu zou ik dit in een PHP pagina om willen zetten, als ik dit doe dan komen de kolomnamen wel, maar geen gegevens.

PHP:
<?php

$link = mysqli_connect("192.168.178.13:3307", "*****", "*******", "****");
 
// Check connection
if($link === false){
    die("ERROR: Could not connect. " . mysqli_connect_error());
}
 
// Attempt select query execution
$sql = "SELECT taken.taken_id AS ID, taken.taken_datum AS Datum, takenlijst.takenlijst_item AS Activiteit, taken.taken_functie AS Functie, taken.taken_bedrijf AS Bedrijf, taken.taken_contactpersoon AS Contactpersoon, status.status_omschrijving AS Status FROM taken, takenlijst, status WHERE taken.taken_activiteit = takenlijst.takenlijst_id AND taken.taken_ingevoerd = 1 AND taken.taken_status = status.status_id";
if($result = mysqli_query($link, $sql)){
    if(mysqli_num_rows($result) > 0){
        echo "<table>";
            echo "<tr>";
                echo "<th>ID</th>";
                echo "<th>Datum</th>";
				echo "<th>Activiteit</th>";
                echo "<th>Functie</th>";
				echo "<th>Bedrijf</th>";
				echo "<th>Contactpersoon</th>";
				echo "<th>Status</th>";
            echo "</tr>";
        while($row = mysqli_fetch_array($result)){
            echo "<tr>";
                echo "<td>" . $row['taken_id'] . "</td>";
                echo "<td>" . $row['taken_datum'] . "</td>";
				echo "<td>" . $row['takenlijst.takenlijst_item,'] . "</td>";
                echo "<td>" . $row['taken_functie'] . "</td>";
				echo "<td>" . $row['taken.taken_bedrijf'] . "</td>";
				echo "<td>" . $row['taken.taken_contactpersoon'] . "</td>";
				echo "<td>" . $row['status.status_omschrijving'] . "</td>";
            echo "</tr>";
        }
        echo "</table>";
        // Free result set
        mysqli_free_result($result);
    } else{
        echo "No records matching your query were found.";
    }
} else{
    echo "ERROR: Could not able to execute $sql. " . mysqli_error($link);
}
 
// Close connection
mysqli_close($link);
?>

Ik heb het gevoel dat ik iets in de "$sql = "SELECT....." wat fouts doe, Is er iemand bereid om even een oogje te werpen?
 
Laatst bewerkt door een moderator:
Laatst bewerkt:
Even kijken de puntjes die je aangaf heel erg bedankt ik heb de inlog gegevens weggehaald, en heb mijn SQL aan gepast hoe je vertelde, is wel overzichtelijker. ;-)

[SQL]
SELECT
taken.taken_id,
taken.taken_datum,
takenlijst.takenlijst_item,
taken.taken_functie,
taken.taken_bedrijf,
taken.taken_contactpersoon,
status.status_omschrijving

FROM

taken

LEFT JOIN takenlijst ON taken.taken_activiteit = takenlijst.takenlijst_id
LEFT JOIN status ON taken.taken_status = status.status_id

[/SQL]
----------------

Yes het is gedeeltelijk gelukt dit is dus de SQL regel
[SQL]
SELECT * FROM taken LEFT JOIN takenlijst ON taken.taken_activiteit = takenlijst.takenlijst_id WHERE taken_ingevoerd =1 ORDER BY taken_datum DESC";
[/SQL]
Maar stel dat ik nog een kolom heb waar uit gehaald moet worden hoe doe je dat?

Dit heb ik geprobeerd 2 keer LEFT JOIN gebruikt
[SQL]SELECT * FROM taken LEFT JOIN takenlijst ON taken.taken_activiteit = takenlijst.takenlijst_id LEFT JOIN status ON taken.taken_status = status.status_id WHERE taken_ingevoerd =1 ORDER BY taken_datum DESC";[/SQL]
Het Woord AND gebruikt
[SQL]SELECT * FROM taken LEFT JOIN takenlijst ON taken.taken_activiteit = takenlijst.takenlijst_id AND LEFT JOIN status ON taken.taken_status = status.status_id WHERE taken_ingevoerd =1 ORDER BY taken_datum DESC";[/SQL]
Komma ertussen gebruikt
[SQL]SELECT * FROM taken LEFT JOIN takenlijst ON taken.taken_activiteit = takenlijst.takenlijst_id, LEFT JOIN status ON taken.taken_status = status.status_id WHERE taken_ingevoerd =1 ORDER BY taken_datum DESC";[/SQL]

Maar ik zie het even niet, of moet het dan helemaal ander?
 
Laatst bewerkt door een moderator:
Gebruik NOOIT * in SQL, en benoem de velden apart.
Met joins kan er snel sprake zijn van ambiguiteit. Dus twee velden ID bijvoorbeeld, en dan snapt je query het niet meer.
 
Mmh elke veld (in verschillende tabelen) zijn uniek. In èèn database komt een tabelnaam maar èèn keer voor. Zo gebruik ik geen id, maar taken_id en status_id.

Ik weet dat * niet goed is, maar wou eerst proberen hoe het werkt met meerdere tabellen. Waar ik nog niet uit ben.
 
Laatst bewerkt:
Per tabel waarin een koppeling met een andere tabel zit heb je een JOIN nodig.

Wat heb je nu? Wat gebeurt er? En hoe ziet je database-structuur eruit? Laat anders eens een dumpje zien.
 
Laatst bewerkt:
Waarom gebruik je geen LEFT JOIN's. Dat maakt het veel overzichtelijker.
Een CROSS JOIN zoals jij gebruikt maakt het best onoverzichtelijk, en mogelijk zelfs ook trager.

https://www.w3schools.com/sql/sql_join_left.asp
https://www.w3schools.com/sql/sql_join_right.asp

PS: Weet je zeker dat je je inloggegevens hier wilt publiceren? ;)
Indien MySQL hetzelfde werkt als MSSQL maakt de wijze waarop je de query opstelt niet al te veel uit (dit type query's althans), jij bepaald dan immers het executiepad niet maar de SQL server die het eerst optimaliseert voor uitvoering van de query.

Maar on topic.
@jelleruben, ben je bekend met verwijssleutels?

Het sleutelwoord LEFT is onnodig omdat dit altijd als default gebruikt wordt.
[SQL]SELECT *
FROM taken T
INNER JOIN takenlijst TL ON T.taken_activiteit = TL.takenlijst_id
INNER JOIN status S ON T.taken_status = S.status_id
WHERE T.taken_ingevoerd = 1
ORDER BY T.taken_datum DESC";[/SQL]

Als je output leeg is controleer de query dan een direct in PHPMyAdmin of een dergelijke tool of controleer of er een lege tabel terug is gegeven.

Je oorspronkelijke probleem zou er ook wel eens mee te maken kunnen hebben dat je aliassen aanmaakt voor de kolommen in je SQL-statement en die vervolgens niet gebruikt in je PHP-code.
 
Laatst bewerkt door een moderator:
Hallo Student101,

Heel erg bedankt, Ik heb verwijssleutels ooit wel eens gezien, maar zelf nog niet mee gewerkt.
Bedankt voor je SQL code, mijn pagina werkt nu na wens. En ik zal zelf naar deze code goed kijken, en
ervan leren.

Bedankt.
 
Laatst bewerkt:
Een simpele (in dit geval PDO) functie die voor een beginner niet complex is en makkelijk in gebruik.
Code:
<?php

// Config zelf invullen
define("HOST", "localhost");
define("USER", "username");
define("PASS", "password");
define("NAME", "database");

// database connecten
try {
  $db = new PDO("mysql:host=".HOST.";dbname=".NAME.";charset=utf8", "".USER."", "".PASS."");
  $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  $db->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
} catch (PDOException $e) {
  echo $e->getMessage();
}

// Eenvoudige functie voor pdo
function sql($db, $q, $params, $return) {
  $stmt = $db->prepare($q);
  $stmt->execute($params);
  if ($return == "rows") {
    return $stmt->fetchAll();
  } elseif ($return == "count") {
    return $stmt->rowCount();
  }
}

// voorbeeld SELECT
$rows = sql($db, "SELECT * FROM table WHERE id = ?", array($id), "rows");
foreach($rows as $row) {
  echo $row['field1'].' '.$row['field2']; //etc...
}

// voorbeeld INSERT
sql($db, "INSERT INTO table (field1, field2, field3) VALUES (?, ?, ?)", array($id, $name, $pass));

// voorbeeld UPDATE
sql($db, "UPDATE table SET name = ? WHERE id = ?", array($name, $id));

// voorbeeld DELETE
sql($db, "DELETE FROM table WHERE id = ?", array($id));
?>
Suc6. Have fun.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan