Volledige versie bekijken : MySQL BETWEEN Variabelen?!



Stuntman Phil
24 February 2011, 21:36
Heyla!

Voor mijn eindwerk moet ik een webshop maken,
nu was ik bezig met een zoekfunctie in te bouwen, om producten uit de databank op te vragen tussen 2 bepaalde prijzen (de gebruiker moet dan een minimum & maximum bedrag invoeren in 2 tekstvakken en op een knop drukken om te zoeken)

Mijn vraag, hoe stel je die Query op om tussen die 2 bedragen de bijhorende producten op te vragen?!

Dit is mijn huidige, maar die werkt niet...

$sql="SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN '" . $minimum . " AND " . $maximum ."'";

(&minimum en &maximum zijn de 2 variabelen van de POST van de 2 tekstvakken)

Can anyone help me? More info needed? Ask!

Butterflyice
24 February 2011, 22:02
Vang je de min en max eerst af voor je het gebruikt in de query ?




$minimum = $_POST[''minimum];
$maximum = $_POST["maximum "];

$sql="SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN '" . $minimum . " AND " . $maximum ."'";



Dan behoort hij wel te werken.

Stuntman Phil
24 February 2011, 22:16
Ja zo staat het er op:

$minimum=$_POST['minimum'];
$maximum=$_POST['maximum'];

Werkt niet =/...

Butterflyice
25 February 2011, 07:22
Heb je de database tabel voor mij zo dat ik kan testen.

Stuntman Phil
25 February 2011, 13:03
Hoe kan ik deze doorsturen ofzo? Want die staat in Xampp...

Stuntman Phil
25 February 2011, 13:09
Dit is momenteel de code van de hele pagina


<html>
<head>
<title>Diamond PCWorks</title>
<link rel="stylesheet" type="text/css" href="../inhoud/css/algemeen.css" />
<script type="text/javascript">
function legen()
{
document.zoek.name.value="";
}
function legengeldmi()
{
document.zoekgeld.minimum.value="";
}
function legengeldma()
{
document.zoekgeld.maximum.value="";
}
</script>
</head>
<body>
<div class="rounded-boxxx">
<div class="top-left-cornerxx"><div class="top-left-insidexx">&bull;</div></div>
<div class="bottom-left-cornerxx"><div class="bottom-left-insidexx">&bull;</div></div>
<div class="top-right-cornerxx"><div class="top-right-insidexx">&bull;</div></div>
<div class="bottom-right-cornerxx"><div class="bottom-right-insidexx">&bull;</div></div>
<div class="box-contentsxx">
<a href="../inhoud/index.html" /><img src="../afbeeldingen/knophome.jpg" border = none/></a>
<a href="../inhoud/producten.html" /><img src="../afbeeldingen/knopproducten.jpg" border = none/></a>
<a href="../inhoud/crew.html" /><img src="../afbeeldingen/knopcrew.jpg" border = none/></a>
<a href="../inhoud/contact.html" /><img src="../afbeeldingen/knopcontact.jpg" border = none/></a>
</div>
</div>
<div class="rounded-box">
<div class="top-left-corner"><div class="top-left-inside">&bull;</div></div>
<div class="bottom-left-corner"><div class="bottom-left-inside">&bull;</div></div>
<div class="top-right-corner"><div class="top-right-inside">&bull;</div></div>
<div class="bottom-right-corner"><div class="bottom-right-inside">&bull;</div></div>
<div class="box-contents">
<a href="../inhoud/producten.html" /><img src="../afbeeldingen/knopterug.jpg" border = none/></a>
<h1>Grafische Kaarten:</h1>
<img src="../afbeeldingen/producten/graka.jpg" height="150" width="200" />
<form name="zoek" method="post" action="<?php echo $SERVER['PHP_SELF'];?>">
<input type="text" name="name" style="width:300px;font-family:cursive;border:groove;color:grey;font-style:italic;" value="Geef de naam of een deel ervan in om te zoeken" onfocus='legen()'>
<input type="submit" name="submit" value="Zoek op sleutelwoorden">
</form>
<form name="zoekgeld" method="post" action="<?php echo $SERVER['PHP_SELF'];?>">
<input type="text" name="minimum" style="width:70px;font-family:cursive;border:groove;color:grey;font-style:italic;" value="Minimum" onfocus='legengeldmi()'>
<input type="text" name="maximum" style="width:70px;font-family:cursive;border:groove;color:grey;font-style:italic;" value="Maximum" onfocus='legengeldma()'>
<input type="submit" name="submit" value="Zoek op geld">
</form>
<p>Dit zijn zeg maar, de ogen van de computer.<br/>De grafische kaart zorgt dat data die hij binnen gestuurd krijgt, wordt omgezet in (meestal 3D) beeld op uw monitor.<br/> De laatste generaties van grafische kaarten, neemt ook een deel van de processor zijn werk voor zijn rekening. </p>
<?php

$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'root';
$database = 'gip';
$result = null;
$db = null;

if(isset($_POST['submit'])){
if($_POST['name']){
$name=$_POST['name'];
//connect to the database
$db=mysql_connect ("localhost", "root", "root") or die ('I cannot connect to the database because: ' . mysql_error());
//-select the database to use
$mydb=mysql_select_db("gip");
//-query the database table

$mysqli = new mysqli($host, $gebruiker, $wachtwoord);
$mysqli->select_db($database);
//-query the database table
$sql="SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductNaam LIKE '%" . $name . "%' OR ProductInfo LIKE '%" . $name ."%'";
//-run the query against the mysql query function
$result=mysql_query($sql);
//-create while loop and loop through result set
while($row=mysql_fetch_array($result)){
$ProductNaam =$row['ProductNaam'];
$ProductInfo =$row['ProductInfo'];
$ProductVerkoopprijs =$row['ProductVerkoopprijs'];

//-display the result of the array
echo "<b>" .$ProductNaam. ":</b><br />";
echo "" .$ProductInfo. "<br />";
echo "<b>€" .$ProductVerkoopprijs. "</b><br /><br />";
}
}
else if($_POST['submit']){
$minimum=$_POST['minimum'];
$maximum=$_POST['maximum'];
//connect to the database
$db=mysql_connect ("localhost", "root", "root") or die ('I cannot connect to the database because: ' . mysql_error());
//-select the database to use
$mydb=mysql_select_db("gip");
//-query the database table

$mysqli = new mysqli($host, $gebruiker, $wachtwoord);
$mysqli->select_db($database);
//-query the database table
$sql="SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN '" . $minimum . " AND " . $maximum ."'";
//-run the query against the mysql query function
$result=mysql_query($sql);
//-create while loop and loop through result set
while($row=mysql_fetch_array($result)){
$ProductNaam =$row['ProductNaam'];
$ProductInfo =$row['ProductInfo'];
$ProductVerkoopprijs =$row['ProductVerkoopprijs'];

//-display the result of the array
echo "<b>" .$ProductNaam. ":</b><br />";
echo "" .$ProductInfo. "<br />";
echo "<b>€" .$ProductVerkoopprijs. "</b><br /><br />";
}
}
else{
echo "<b>Gelieve iets in te voeren!</b>";
}
}
else{
$mysqli = new mysqli($host, $gebruiker, $wachtwoord);
$mysqli->select_db($database);
$sql = "SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductCategorie = 'GRA' GROUP BY ProductVerkoopprijs ";
$query = $mysqli->query($sql);
$num = mysqli_num_rows($query);

if(empty($num)) {
echo "<p>Er zijn geen producten gevonden.</p>\n";
} else {

while($product = mysqli_fetch_object($query)) {
echo "<b>".$product->ProductNaam.":</b><br />";
echo "".$product->ProductInfo."<br />";
echo "<b>€".$product->ProductVerkoopprijs."</b><br /><br />";
}
}
}


?>
</div>
</div>


</body>
</html>

Butterflyice
25 February 2011, 13:46
Waar zijn je database tabellen?
Dit is de code van de pagina.
Als goed is heb je ook een database.
daar staan de tabellen in deze wil ik graag hebben om te testen.

Stuntman Phil
25 February 2011, 13:54
Waar zijn je database tabellen?
Dit is de code van de pagina.
Als goed is heb je ook een database.
daar staan de tabellen in deze wil ik graag hebben om te testen.

Ja ik snap wat je bedoelt, maar ik weet niet hoe ik deze tabellen kan doorsturen? Ik kan de databank exporteren dan heb ik een .sql bestandje, maar hoe zet ik 'm dan hierop? (& Sorry voor het "dom zijn" haha...)

ultddave
25 February 2011, 14:52
Ik zie wel dat ge MySQLi en MySQL code door elkaar gebruikt ;

Hier bijvoorbeeld SQL code:

$db=mysql_connect ("localhost", "root", "root") or die ('I cannot connect to the database because: ' . mysql_error());
//-select the database to use
$mydb=mysql_select_db("gip");
//-query the database table

En dan direct erna MySQLi code

$mysqli = new mysqli($host, $gebruiker, $wachtwoord);
$mysqli->select_db($database);

Ik zie dan ook dit => Mysqli connectie, ma geen mysqli_query, ma wel mysql_query. nu ge hebt nog hoger een mysql connectie open staan, dus dat zal toch geen problemen geven, ma het staat allemaal door elkaar ;P.


$mysqli = new mysqli($host, $gebruiker, $wachtwoord);
$mysqli->select_db($database);

$sql="SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN '" . $minimum . " AND " . $maximum ."'";

$result=mysql_query($sql);


Tis trouwens niet de bedoeling dat ge voor elke query een nieuwe connectie opzet.

=> Keuze maken of ge met mysql of mysqli gaat werken.
=> Database connectie maken.
=> Database selecteren
=> Query uitvoeren
=> Resultaat van query ergens voor gebruiken
=> Nieuwe query uitvoeren
=> Nieuw resultaat ergens voor gebruiken
=> Connectie sluiten

Dus in code vorm is dat (voor mysqli):


$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'root';
$database = 'gip';

# Mysqli connectie opzetten.
$mysqli = new mysqli($host, $gebruiker, $wachtwoord, $database);

# Kijken of het maken van de connectie gelukt is.
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}

$minimum=$_POST['minimum'];
$maximum=$_POST['maximum'];

# Als ge parameters in een query gaat invoegen, kunt ge best op deze manier werken.
# De prepare statement van mysqli gaat SQL injection voorkomen. ;)
# Elk vraagteken stelt dus de plaats van een parameter voor
if ($stmt = $mysqli->prepare("SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN ? AND ?")) {

# Parameters invullen. i > Integer. s > String.
$stmt->bind_param("ii", $minimum, $maximum);

# Query effectief uitvoeren.
$stmt->execute();

# Resultaten binden aan variabelen.
$stmt->bind_result($productNaam, $productInfo, $productVerkoopprijs);

# Effectief fetchen van elke rij.
while ($stmt->fetch())
printf ("Naam: %s, Info: %s, Prijs: %s\n", $productNaam, $productInfo, $productVerkoopprijs);

# Statement sluiten
$stmt->close();
}

# Connectie sluiten.
$mysqli->close();


Ge kunt ook uw resultaten in een array opvangen ipv apparte variabele voor elke kolom etc. Ma tis maar als voorbeeld. ;)

(Het gaat het probleem mss niet oplossen, ma de code is dan alleszins duidelijker :D.)

PS: De code hierboven bevat weinig error handling, zo wordt er ook niet gekeken of die 2 POST variabelen effectief bestaan etc. Tis vooral bedoelt als voorbeeld van het gebruik van mysqli. ;)

Mvg,
Dave

Stuntman Phil
25 February 2011, 15:34
Haha ja, de leerkracht waarvan ik les krijg is zelf gans in de war daarmee... Slaat dus blijkbaar door naar zijn leerlingen xD

Butterflyice
25 February 2011, 20:20
het SQL bestand openen met bv kladblok de inhoud kopieeren en hier plaatsen.

Dan kunnen we het testen voor je.

Stuntman Phil
27 February 2011, 20:28
Et voila:


-- phpMyAdmin SQL Dump
-- version 3.2.4
-- http://www.phpmyadmin.net
--
-- Machine: localhost
-- Genereertijd: 27 Feb 2011 om 19:27
-- Serverversie: 5.1.41
-- PHP-Versie: 5.3.1

SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `gip`
--
CREATE DATABASE `gip` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `gip`;

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `klanten`
--

CREATE TABLE IF NOT EXISTS `klanten` (
`KlantId` int(11) NOT NULL AUTO_INCREMENT,
`KlantVoornaam` varchar(50) NOT NULL,
`KlantNaam` varchar(50) NOT NULL,
`KlantAdres` varchar(50) NOT NULL,
`KlantPostcode` varchar(10) NOT NULL,
`KlantGemeente` varchar(50) NOT NULL,
`KlantEmail` varchar(50) NOT NULL,
`KlantTelefoon` varchar(20) NOT NULL,
PRIMARY KEY (`KlantId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Gegevens worden uitgevoerd voor tabel `klanten`
--


-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `leden`
--

CREATE TABLE IF NOT EXISTS `leden` (
`LedenId` int(11) NOT NULL AUTO_INCREMENT,
`LedenInlognaam` varchar(10) NOT NULL,
`LedenPaswoord` varchar(20) NOT NULL,
`LedenEmail` varchar(50) NOT NULL,
`LedenTelefoonnummer` varchar(12) NOT NULL,
PRIMARY KEY (`LedenId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

--
-- Gegevens worden uitgevoerd voor tabel `leden`
--

INSERT INTO `leden` (`LedenId`, `LedenInlognaam`, `LedenPaswoord`, `LedenEmail`, `LedenTelefoonnummer`) VALUES
(3, 'Philippe', 'settlers4', 'niknak_niknak@hotmail.com', '0484169681'),
(4, 'anja', 'azerty', 'anja@live.be', '0478590989'),
(5, 'Jozef', '123456', 'jef.mesotten@telenet.be', '0865486489'),
(6, 'Pascal', 'milan', 'bdhgfrebhyu', '015849478');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `leveranciers`
--

CREATE TABLE IF NOT EXISTS `leveranciers` (
`LeveranciersId` int(11) NOT NULL AUTO_INCREMENT,
`LeveranciersNaam` varchar(50) NOT NULL,
`LeveranciersAdres` varchar(50) NOT NULL,
`LeveranciersPostcode` varchar(10) NOT NULL,
`LeveranciersGemeente` varchar(50) NOT NULL,
`LeveranciersEmail` varchar(50) NOT NULL,
`LeveranciersTelefoon` varchar(20) NOT NULL,
PRIMARY KEY (`LeveranciersId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Gegevens worden uitgevoerd voor tabel `leveranciers`
--


-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `producten`
--

CREATE TABLE IF NOT EXISTS `producten` (
`ProductId` int(11) NOT NULL AUTO_INCREMENT,
`ProductCategorie` varchar(3) NOT NULL,
`ProductNaam` text NOT NULL,
`ProductInfo` text NOT NULL,
`ProductAankoopprijs` double NOT NULL,
`ProductVerkoopprijs` double NOT NULL,
`ProductInVoorraad` int(11) NOT NULL,
`ProductMinVoorraad` int(11) NOT NULL,
`ProductReleasedatum` date NOT NULL,
PRIMARY KEY (`ProductId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=8 ;

--
-- Gegevens worden uitgevoerd voor tabel `producten`
--

INSERT INTO `producten` (`ProductId`, `ProductCategorie`, `ProductNaam`, `ProductInfo`, `ProductAankoopprijs`, `ProductVerkoopprijs`, `ProductInVoorraad`, `ProductMinVoorraad`, `ProductReleasedatum`) VALUES
(1, 'PRO', 'Intel Core i7 2600K', 'CPU-voet: Socket 1155, Klokfrequentie: 3,4 GHz, Cores: 4, Productie-procédé: 32 nm, Geïntegreerde graphics: Ja', 280, 310, 5, 1, '2011-02-22'),
(2, 'GRA', 'Sapphire Radeon HD 6950 2GB', '3D-chip: AMD Radeon HD 6950, DirectX versie: DirectX 11.0, Interface: PCI-Express x16, Geheugen - Hoeveelheid: 2048 MB, Klokfrequentie chip: 800 MHz', 200, 230, 12, 2, '2011-02-01'),
(3, 'HDD', 'Seagate Momentus XT 500GB', 'Type schijf: Harddisk, Opgegeven capaciteit: 500 GB, Prijs per gigabyte: € 0,224, Rotatiesnelheid: 7200 rpm, Afmeting: 2.5 inch, Interface: Serial ATA 300', 70, 97, 6, 3, '2011-01-04'),
(4, 'MOB', 'Gigabyte GA-H55M-UD2H', 'Formaat: Micro ATX, CPU socket: Socket 1156, Type geheugen: DDR3, Chipset: Intel H55', 60, 90, 3, 1, '2011-01-11'),
(5, 'GEH', 'Corsair XMS3 8GB DDR3-1600 CL9 kit', 'Totale capaciteit: 8 GB, Type geheugen: DDR3, Opgegeven klokfrequentie: 1600 MHz, Type module: DIMM, Kit van meerdere modules: Ja, Opgegeven CAS latency: 9, ECC: Ja', 70, 85, 3, 1, '2011-02-02'),
(6, 'GRA', 'ASUS EAH6950/2DI2S/2GD5', '3D-chip: AMD Radeon HD 6950, DirectX versie: DirectX 11.0, Interface: PCI-Express x16, Geheugen - Hoeveelheid: 2048 MB, Klokfrequentie chip: 800 MHz', 220, 250, 3, 1, '2011-01-12'),
(7, 'GRA', 'MSI N460GTX Hawk', '3D-chip: nVidia GeForce GTX 460, DirectX versie: DirectX 11.0, Interface: PCI-Express x16, Geheugen - Hoeveelheid: 1024 MB, Klokfrequentie chip: 780 MHz', 160, 180, 3, 1, '2011-02-01');

-- --------------------------------------------------------

--
-- Tabelstructuur voor tabel `winkelwagen`
--

CREATE TABLE IF NOT EXISTS `winkelwagen` (
`WinkelwagenId` int(11) NOT NULL AUTO_INCREMENT,
`WinkelwagenKlantId` int(11) NOT NULL,
`WinkelwagenOrder` int(11) NOT NULL,
PRIMARY KEY (`WinkelwagenId`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=1 ;

--
-- Gegevens worden uitgevoerd voor tabel `winkelwagen`
--


/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;

Butterflyice
27 February 2011, 21:09
Zo te zien werkt het zo wel goed heb een testje gedaan deze staan nu uit gezet maar kan je aanzetten om te testen.

Mocht het niet goed bioj jouw werken dan moeten we kijken hoe je aan de min en max prijd komt.


<?php
$host = 'localhost';
$gebruiker = 'root';
$wachtwoord = 'root';
$database = 'gip';
# Mysqli connectie opzetten.
$mysqli = new mysqli($host, $gebruiker, $wachtwoord, $database);
# Kijken of het maken van de connectie gelukt is.
if (mysqli_connect_error()) {
die('Connect Error (' . mysqli_connect_errno() . ') '
. mysqli_connect_error());
}
$minimum = $_POST['minimum'];
$maximum = $_POST['maximum'];
// test
//$minimum = 100;
//$maximum = 400;
//einde test
# Als ge parameters in een query gaat invoegen, kunt ge best op deze manier werken.
# De prepare statement van mysqli gaat SQL injection voorkomen. ;)
# Elk vraagteken stelt dus de plaats van een parameter voor
if ($stmt = $mysqli->prepare("SELECT ProductNaam, ProductInfo, ProductVerkoopprijs FROM producten WHERE ProductVerkoopprijs BETWEEN ". $minimum. " AND ".$maximum." ORDER BY ProductVerkoopprijs ASC
")) {
# Parameters invullen. i > Integer. s > String.
// $stmt->bind_param($minimum, $maximum);
# Query effectief uitvoeren.
$stmt->execute();
# Resultaten binden aan variabelen.
$stmt->bind_result($productNaam, $productInfo, $productVerkoopprijs);
# Effectief fetchen van elke rij.
while ($stmt->fetch())
printf ("Naam: %s, Info: %s, Prijs: %s\n", $productNaam, $productInfo, $productVerkoopprijs);
# Statement sluiten
$stmt->close();
}
# Connectie sluiten.
$mysqli->close();
?>

Stuntman Phil
28 February 2011, 20:11
Het werkt, YEAY! haha, ik was me er echt scheel op aan't zoeken

TnQ very much! ;)

(mag een slotje op!)