Hoi,


Ik heb hier een klanten systeem waarbij er gegevens kunnen worden ingevoerd zoals:




Deze pagina maakt een nieuwe regel in de database en in de database worden deze gegevens gekoppeld aan een ID (Oplopend naar elke nieuwe invoer)


  mysqli_query($con,"insert into klantorder (naam,email,telefoon,status,notitie,imei,toestel,klacht,type,merk) values('$naam','$email','$telefoon','$status','$notitie','$imei','$toestel','$klacht','$type','$merk')");
	echo "<script>alert('Data Updated');</script>";	
	}


Stel als hij als ID 30 in de database komt te staan dan zou ik willen dat hij naar de echo redirected word naar edit-user.php?id=30


Alleen hoe fetch ik de laatste ID die is aangemaakt in de database ?



mysqli_insert_id() na je INSERT-query.

Los van dit raad ik wel aan om je query te controleren met een if-else. Nu zeg je op voorhand al dat het gelukt is, terwijl daar geen zekerheid van is.
De vraag even aangepast.

“fetch last ID die is aangemaakt in de database”

Plakken in Google en je wordt overspoeld met antwoorden.
- Ariën - op 31/01/2022 19:07:15

mysqli_insert_id() na je INSERT-query.

Los van dit raad ik wel aan om je query te controleren met een if-else. Nu zeg je op voorhand al dat het gelukt is, terwijl daar geen zekerheid van is.


Thanks dat werkt idd prima :)

de query word pas uitgevoerd door een if button ik heb er nu een else error aan toegevoegd bedoel je dit ? of nog een extra controlle om de query te controleren ?


if(isset($_POST['submit']))
{
  $naam=$_POST['naam'];
  $email=$_POST['email'];
  $telefoon=$_POST['telefoon'];
  $status=$_POST['status'];
  $notitie=$_POST['notitie'];
  $imei=$_POST['imei'];
  $toestel=$_POST['toestel'];
  $klacht=$_POST['klacht'];
  $type=$_POST['type'];
  $merk=$_POST['merk'];


  mysqli_query($con,"insert into klantorder (naam,email,telefoon,status,notitie,imei,toestel,klacht,type,merk) values('$naam','$email','$telefoon','$status','$notitie','$imei','$toestel','$klacht','$type','$merk')");
  $lastid = mysqli_insert_id($con);
  echo "<script>alert('Data Updated');</script>";	
  header("refresh:1;url=edit-user.php?id=$lastid");
  die();
} else {
  echo "error";
	} 



[size=xsmall]Toevoeging op 31/01/2022 21:22:48:[/size]

Adoptive Solution op 31/01/2022 19:12:02

De vraag even aangepast.

“fetch last ID die is aangemaakt in de database”

Plakken in Google en je wordt overspoeld met antwoorden.


Is het doel van een forum niet om elkaar te helpen ? :) voor jou is dit een simpele vraag voor mij helaas niet, uiteraard zoek ik eerst maar ik mag dus niet om een mening vragen of om advies ?
Het forum is zeker bedoeld om iemand te helpen, en een mening of advies vragen hoort er zeker bij. Maar er wordt wel een zelfred-zaamheid verwacht, wat gelukkig niet geëist wordt. Daarom wordt het altijd wel verwacht dat iemand via Google, DuckDuckGo of wat dan ook eerst even zelf wat opzoekt. Met Engelse termen kom je vaak al een flink eind. Als ik al zoek op 'php insert query last id' kom ik al een hoop bruikbare tips tegen.

Om terug te komen op mijn opmerking: Ik doelde op je query. Hier mis foutafhandeling:
Stel dat je query niet werkt om bepaalde redenen, zoals bijv. een databaseprobleem, kapotte query of SQL-injection, dan schotel je de gebruiker direct een alert voor met: Data updated. Maar dat is dus valse informatie. In dat geval loont het dus om met een if-else constructie om je mysqli_query te kijken of deze false is, en in dat geval een foutmelding te tonen, of nog liever op de achtergrond te loggen. Bezoekers hebben geen baat bij een 'syntax error', maar wel baat bij een: 'Er is bij ons een technische storing...'.

Daarnaast mist er escaping in je query, en kan jan-en-alleman de query aanpassen, met kwade gevolgen van dien. Ook jij zelf kan de query laten mislukken met bijv. 's Hertogenbosch als waarde. Dus gebruik daarom altijd mysqli_real_escape_string($con,$_POST['.....'])

Verder kan je een header() NOOIT gebruiken als je al eerder output geplaatst hebt.

En ook raad ik aan om i.p.v. if(isset($_POST['submit'])) te controleren of de POST-methode uitgevoerd is:

if($_SERVER['REQUEST_METHOD'] == "POST") {
// Er is een POST-request uitgevoerd
// voer hier alles uit.
}

Ik weet niet of het veel uitmaakt, maar het is in ieder geval logischer dan dat je staat te controleren of een knop bestaat. Met de &&-operator (AND) kan je beiden ook in één keer controleren.
Duidelijk, inprinciepe word er na de POST doorgelinkt naar de bewerk pagina dan zie ik of het goed gegaan is, dit systeem word enkel door mij alleen gebruikt voor administratie dus het hoeft niet helemaal perfect te zijn, daardoor ook niet bang voor mysql injecties :)

Ik ben momenteel bezig met een factuur systeem, bezig met het zelfde princiepe na de post doorlinken naar bewerkpagina ?id= en dan laatst toegevoegde id alleen werkt het niet (Ander tabel alleen heet het veld geen id maar order_id) wel ook als primaire key.

Wat doe ik fout? kunnen er geen 2 verschillende id's zijn ? moet ik order_id veranderen naar id ?
Ik heb al een hoop verschillende manieren gezocht en getest maar niks werkt ik kom hier niet uit

de code:


include ("Invoice.php");
$invoice = new Invoice();


if(isset($_POST['submit']))
{
	$invoice->saveInvoice($_POST);
	header("refresh:1;url=edit_invoice.php?update_id=$lastInsertId");
	
}



invoice.php :


	public function saveInvoice($POST) {		
		$sqlInsert = "
			INSERT INTO ".$this->invoiceOrderTable."(user_id, order_receiver_name, order_receiver_address, straatt, telefoonn, emaill, order_total_before_tax, order_total_tax, order_tax_per, order_total_after_tax, order_amount_paid, order_total_amount_due, note) 
			VALUES ('".$POST['userId']."', '".$POST['companyName']."', '".$POST['address']."', '".$POST['straat']."', '".$POST['telefoon']."', '".$POST['email']."', '" .$POST['subTotal']."', '".$POST['taxAmount']."', '".$POST['taxRate']."', '".$POST['totalAftertax']."', '".$POST['amountPaid']."', '".$POST['amountDue']."', '".$POST['notes']."')";		
		mysqli_query($this->dbConnect, $sqlInsert);
		$lastInsertId = mysqli_insert_id($this->dbConnect);
Ricardo B op 02/02/2022 17:16:42

Duidelijk, inprinciepe word er na de POST doorgelinkt naar de bewerk pagina dan zie ik of het goed gegaan is, dit systeem word enkel door mij alleen gebruikt voor administratie dus het hoeft niet helemaal perfect te zijn, daardoor ook niet bang voor mysql injecties :)

Als je goed leest is dat geen enkele valide reden. Je kan immers ook onwetend je query laten vastlopen zonder dat je merkt.

Voeg maar eens Jeanne d'Arc toe en ervaar!

Verder is het $_POST een geen $POST.

Over je probleem: Je ID veld is wel AutoIncrement en Primairy Key?
Ik zal het later eens testen ben wel benieuwd (Niet dat ik je niet geloof) en dan zal ik alles eens een update geven.

Ook weer gelijk dat is wel een puntje dat ik niet de juiste termen overneem excuus.

Yes, ik heb tabel klantorder met een kolom id Primairy key + auto increment dat werkt goed om te koppelen
alleen kolom invoice_order met order_id Primairy key + auto increment werkt niet.

Ik heb een button die verwijst naar create_invoice.php?id=5 (Dat id is lastid) database waardes worden opgehaald op basis van lastid, en op die zelfde pagina heb ik een knop om de factuur te maken en dat is dan de $_POST waarde die dan weer verwijst naar invoice.php

het zou zo mogelijk moeten zijn lijkt mij
Ik heb er nooit problemen mee gehad.
Wat zegt een var_dump op $lastInsertId?

Als het niet werkt, heb je een SQL-dumpje van je structuur?
var_dump geeft NULL aan, maar die zou pas een value hebben als er op een knop word gedrukt en $_POST in werking word gezet -> invoice.php

ik heb de var_dump zo toegevoegd dat is prima lijkt mij:


if(isset($_POST['submit']))
{
	$invoice->saveInvoice($_POST);
	header("refresh:1;url=edit_invoice.php?update_id=$lastInsertId");
}

echo '<pre>';
var_dump($lastInsertId);
echo '</pre>';

?>




Hierbij de SQL dump (Adressen en namen zijn fictief aantal erin laten staan)




-- phpMyAdmin SQL Dump
-- version 4.9.5
-- https://www.phpmyadmin.net/
--
-- Host: localhost
-- Gegenereerd op: 02 feb 2022 om 21:43
-- Serverversie: 10.3.24-MariaDB-cll-lve
-- PHP-versie: 5.5.38

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET AUTOCOMMIT = 0;
START TRANSACTION;
SET time_zone = "+00:00";


/*!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 utf8mb4 */;

--
-- Database: `u84600p79297_crm`
--

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

--
-- Tabelstructuur voor tabel `admin`
--

CREATE TABLE `admin` (
  `id` int(11) NOT NULL,
  `name` varchar(255) NOT NULL DEFAULT '',
  `password` varchar(255) NOT NULL DEFAULT ''
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

--
-- Gegevens worden geëxporteerd voor tabel `admin`
--

INSERT INTO `admin` (`id`, `name`, `password`) VALUES
(1, 'admin', 'admin');

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

--
-- Tabelstructuur voor tabel `invoice_order`
--

CREATE TABLE `invoice_order` (
  `order_id` int(11) NOT NULL,
  `order_date` date NOT NULL DEFAULT current_timestamp(),
  `order_receiver_name` varchar(250) NOT NULL,
  `straatt` varchar(255) CHARACTER SET swe7 NOT NULL,
  `order_receiver_address` text NOT NULL,
  `telefoonn` varchar(255) CHARACTER SET swe7 NOT NULL,
  `emaill` varchar(255) NOT NULL,
  `order_total_before_tax` decimal(10,2) NOT NULL,
  `order_total_tax` decimal(10,2) NOT NULL,
  `order_tax_per` varchar(250) NOT NULL,
  `order_total_after_tax` double(10,2) NOT NULL,
  `order_amount_paid` decimal(10,2) NOT NULL,
  `order_total_amount_due` decimal(10,2) NOT NULL,
  `note` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden geëxporteerd voor tabel `invoice_order`
--

INSERT INTO `invoice_order` (`order_id`, `order_date`, `order_receiver_name`, `straatt`, `order_receiver_address`, `telefoonn`, `emaill`, `order_total_before_tax`, `order_total_tax`, `order_tax_per`, `order_total_after_tax`, `order_amount_paid`, `order_total_amount_due`, `note`) VALUES
(740, '2022-02-02', 'Piet Post', '', 'Grachtensingel 80, 8472 DD Utrecht', '064644646', '[email protected]', '0.00', '0.00', '', 0.00, '0.00', '0.00', 'gsdfg'),
(741, '2022-02-02', 'Karel Vries', '', 'Karel Klapstraat, 98, 3829 DD Amsterdam', '064578854121', '[email protected]', '0.00', '0.00', '', 0.00, '0.00', '0.00', 'dfgh');

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

--
-- Tabelstructuur voor tabel `invoice_order_item`
--

CREATE TABLE `invoice_order_item` (
  `order_item_id` int(11) NOT NULL,
  `order_id` int(11) NOT NULL,
  `item_code` varchar(250) NOT NULL,
  `item_name` varchar(250) NOT NULL,
  `order_item_quantity` decimal(10,2) NOT NULL,
  `order_item_price` decimal(10,2) NOT NULL,
  `order_item_final_amount` decimal(10,2) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden geëxporteerd voor tabel `invoice_order_item`
--

INSERT INTO `invoice_order_item` (`order_item_id`, `order_id`, `item_code`, `item_name`, `order_item_quantity`, `order_item_price`, `order_item_final_amount`) VALUES
(4378, 2, '13555', 'Face Mask', '1.00', '41.00', '41.00'),
(4379, 2, '34', 'mobile', '1.00', '41.00', '41.00'),


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

--
-- Tabelstructuur voor tabel `invoice_user`
--

CREATE TABLE `invoice_user` (
  `id` int(11) NOT NULL,
  `email` varchar(100) NOT NULL,
  `password` varchar(100) NOT NULL,
  `first_name` varchar(100) NOT NULL,
  `last_name` varchar(100) NOT NULL,
  `mobile` bigint(20) NOT NULL,
  `address` text NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden geëxporteerd voor tabel `invoice_user`
--

INSERT INTO `invoice_user` (`id`, `email`, `password`, `first_name`, `last_name`, `mobile`, `address`) VALUES
(123456, '[email protected]', '1223345', 'aaaaadddmiiiin', '', 12345678912, 'New Delhi 110096 India.');

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

--
-- Tabelstructuur voor tabel `klantorder`
--

CREATE TABLE `klantorder` (
  `id` int(11) NOT NULL,
  `type` varchar(255) CHARACTER SET swe7 DEFAULT NULL,
  `naam` varchar(255) DEFAULT NULL,
  `straat` varchar(255) CHARACTER SET swe7 NOT NULL,
  `adres` varchar(255) CHARACTER SET swe7 DEFAULT NULL,
  `email` varchar(255) DEFAULT NULL,
  `telefoon` varchar(255) DEFAULT NULL,
  `status` varchar(255) DEFAULT NULL,
  `notitie` varchar(500) DEFAULT NULL,
  `imei` varchar(255) DEFAULT NULL,
  `merk` varchar(255) CHARACTER SET swe7 NOT NULL,
  `toestel` varchar(255) DEFAULT NULL,
  `datum` date DEFAULT current_timestamp(),
  `klacht` varchar(255) DEFAULT NULL,
  `image_url` varchar(255) DEFAULT NULL,
  `image_url2` varchar(255) DEFAULT NULL,
  `image_url3` varchar(255) DEFAULT NULL,
  `image_url4` varchar(255) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

--
-- Gegevens worden geëxporteerd voor tabel `klantorder`
--

INSERT INTO `klantorder` (`id`, `type`, `naam`, `straat`, `adres`, `email`, `telefoon`, `status`, `notitie`, `imei`, `merk`, `toestel`, `datum`, `klacht`, `image_url`, `image_url2`, `image_url3`, `image_url4`) VALUES
(1, 'Reparatie', 'Karel Kachel', '', 'Karel Klapstraat, 98, 3829 DD Amsterdam', '[email protected]', '064578854121', 'Gerepareerd', 'Scherm vervangen', '1561615165156', 'Apple', 'Iphone X', '2022-01-27', 'Scherm gebarsten', 'IMG-61f7ff3e2c7807.64653209.png', 'IMG-61fa7d2aa32de6.85503414.png', 'IMG-61f4a07b19b7f5.71220965.jpg', 'IMG-61f4a089091ed0.91107611.jpg'),

--
-- Indexen voor geëxporteerde tabellen
--

--
-- Indexen voor tabel `admin`
--
ALTER TABLE `admin`
  ADD PRIMARY KEY (`id`);

--
-- Indexen voor tabel `invoice_order`
--
ALTER TABLE `invoice_order`
  ADD PRIMARY KEY (`order_id`);

--
-- Indexen voor tabel `invoice_order_item`
--
ALTER TABLE `invoice_order_item`
  ADD PRIMARY KEY (`order_item_id`);

--
-- Indexen voor tabel `invoice_user`
--
ALTER TABLE `invoice_user`
  ADD PRIMARY KEY (`id`);

--
-- Indexen voor tabel `klantorder`
--
ALTER TABLE `klantorder`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT voor geëxporteerde tabellen
--

--
-- AUTO_INCREMENT voor een tabel `admin`
--
ALTER TABLE `admin`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=2;

--
-- AUTO_INCREMENT voor een tabel `invoice_order`
--
ALTER TABLE `invoice_order`
  MODIFY `order_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=742;

--
-- AUTO_INCREMENT voor een tabel `invoice_order_item`
--
ALTER TABLE `invoice_order_item`
  MODIFY `order_item_id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=4484;

--
-- AUTO_INCREMENT voor een tabel `invoice_user`
--
ALTER TABLE `invoice_user`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=123457;

--
-- AUTO_INCREMENT voor een tabel `klantorder`
--
ALTER TABLE `klantorder`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT, AUTO_INCREMENT=38;
COMMIT;

/*!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 */;


[size=xsmall]Toevoeging op 02/02/2022 23:00:07:[/size]

Ik heb net even beter gekeken dit is iets meer code


	public function saveInvoice($POST) {		
		$sqlInsert = "
			INSERT INTO ".$this->invoiceOrderTable."(user_id, order_receiver_name, order_receiver_address, straatt, telefoonn, emaill, order_total_before_tax, order_total_tax, order_tax_per, order_total_after_tax, order_amount_paid, order_total_amount_due, note) 
			VALUES ('".$POST['userId']."', '".$POST['companyName']."', '".$POST['address']."', '".$POST['straat']."', '".$POST['telefoon']."', '".$POST['email']."', '" .$POST['subTotal']."', '".$POST['taxAmount']."', '".$POST['taxRate']."', '".$POST['totalAftertax']."', '".$POST['amountPaid']."', '".$POST['amountDue']."', '".$POST['notes']."')";		
		mysqli_query($this->dbConnect, $sqlInsert);
		$lastInsertId = mysqli_insert_id($this->dbConnect);
		for ($i = 0; $i < count($POST['productCode']); $i++) {
			$sqlInsertItem = "
			INSERT INTO ".$this->invoiceOrderItemTable."(order_id, item_code, item_name, order_item_quantity, order_item_price, order_item_final_amount) 
			VALUES ('".$lastInsertId."', '".$POST['productCode'][$i]."', '".$POST['productName'][$i]."', '".$POST['quantity'][$i]."', '".$POST['price'][$i]."', '".$POST['total'][$i]."')";			
			mysqli_query($this->dbConnect, $sqlInsertItem);
		}       	
	}	



In invoice.php word de id waard die in invoice_order tabel gegenereerd word "gecloond" naar invoice_order_item tabel

de

$lastInsertId = mysqli_insert_id($this->dbConnect);


werkt dus wel volledig in invoice.php maar niet als invoice.php geinclude word op create_invoice


de functie zelf werkt dus wel volledig zonder problemen
Ricardo B op 02/02/2022 17:16:42

Ik ben momenteel bezig met een factuur systeem, bezig met het zelfde princiepe na de post doorlinken naar bewerkpagina ?id= en dan laatst toegevoegde id alleen werkt het niet (Ander tabel alleen heet het veld geen id maar order_id) wel ook als primaire key.

Hoe heb je de orders, facturen en klanten precies gekoppeld?

De primaire sleutel in een tabel wordt niet automatisch gebruikt in andere, afhankelijke tabellen die naar die ID verwijzen. Of anders gezegd: AUTO in AUTO_INCREMENT verwijst naar het automatisch verhogen van de teller in één tabel, niet naar het automatisch koppelen van tabellen.

Als jouw `id` en `order_id` hetzelfde volgnummer moeten krijgen, moet je de automatisch gegenereerde ID uit de hoofdtabel overnemen en zelf invoegen in de afhankelijke tabel. In stappen:

1. Voeg een rij toe in de hoofdtabel.

2. Haal de last_insert_id() van de nieuwe rij op.

3. Voeg een nieuwe rij met die ID toe in de afhankelijke tabel.

Reageren