Data opslaan in mysql db vanuit aanpassing PHPGrid.

Status
Niet open voor verdere reacties.
Hoe ziet je code er uit wanneer je data wijzigt?
 
Geen idee om eerlijk te zijn.. Het is een tool die ik gebruik genaamd PHPGrid.
Deze is de goedkoopste gekochte versie. http://phpgrid.com/

Dit gaat dus allemaal automatisch hiermee.
 
Ik denk toch dat ik dit ga doen voor de trigger, dit in overleg met anderen.
Ik moet dus alleen weten hoe de data van excel naar database wordt omgezet zodat ik de colom names kan 'onderscheppen' en deze kan verwerken in de trigger.

Dit is de code waar dit allemaal gebeurd:

PHP:
									$fileName = $_POST['name'];
$info = pathinfo($_FILES['fileInput']['name']);
$ext = $info['extension']; // get the extension of the file
$newname = $fileName.".".$ext;
$target = 'excelfiles/'.$newname;
move_uploaded_file( $_FILES['fileInput']['tmp_name'], $target);
include 'excel_reader/excel_reader.php';     // include the class
// creates an object instance of the class, and read the excel file data
$excel = new PhpExcelReader;
$excel->read($target);
function sheetTitle($sheet)
{
	// create the table and fill the column names.
	$fileName = $_POST['name'];
	$y = 1;
	$strsql = "CREATE TABLE  `".$fileName."` (id int(10) NOT NULL AUTO_INCREMENT";
	while($y <= $sheet['numCols'])
	{
		$x = 1;
		$cell = $sheet["cells"][$x][$y];
		$re .= $cell;
		$data = array($cell);
		$x++;
		$strsql .= ", `".$data[0]."` VARCHAR(1000)";
		$y++;
	}
	$strsql .= ', KEY(id))';
	$resultTable = mysql_query($strsql);

Ik heb hier en daar gezien dat je aardig goed kan debuggen, dus hoop dat je me hiermee uit de brand kan helpen :p
 
Ik heb al gevonden dat er in $re de data wordt gezet. Ik ga nu proberen om voor di while en in die while de trigger aan te maken zo dat het geautomatiseerd wordt, wanneer je een suggestie heb hoor ik het graag, ik hoop dat ik het daarvoor al heb kunnen oplossen haha
 
In je WHILE haal je alle kolommen op, dus kun je daar gebruik van maken om ook je query te bouwen voor de trigger.

Dus een beetje zoals je nu ook de CREATE-query bouwt door eerst een string te hebben en dan in de WHILE steeds een stukje aan die string te plakken.
 
Dit is wat ik nu heb. de tijdelijke varaible eruit gelaten, en ook wat andere dingetjes, dit moest, voor zo ver ik weet, genoeg zijn. Alleen werkt het nog niet, maar dat is logisch anders zou ik hier niet nog een bericht posten haha..

PHP:
$y = 1;
$strsql = "CREATE TABLE  `".$fileName."` (id int(10) NOT NULL AUTO_INCREMENT";
$strsql2 = "CREATE TRIGGER upd_check AFTER UPDATE ON ".$fileName." FOR EACH ROW";
while($y <= $sheet['numCols'])
{
	$x = 1;
	$cell = $sheet["cells"][$x][$y];
	$re .= $cell;
	$strsql2 .= " IF NEW.".$re." <> OLD.".$re." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$re.", NEW.".$re.") END IF";
	$resultTrigger = mysql_query($strsql2);
	
	if($resultTrigger == FALSE)
	{
		die('Error: '. mysql_error());
	}
	$data = array($cell);
	$x++;
	$strsql .= ", `".$data[0]."` VARCHAR(1000)";
	$y++;
}

$strsql .= ', KEY(id))';
$resultTable = mysql_query($strsql);

Ook moet ik dit voor elke kolom doen. Nu in de while pakt hij alleen de eerste kolom, en de 2e keer zou die de eerste en tweede kolom achter elkaar pakken, dit moet apart.
Enig idee?
 
Laatst bewerkt:
Je moet hem ook pas op het einde toepassen :)

Dus eerste door de hele WHILE laten lopen en een string laten genereren (waar dus alle kolommen in zitten dan)

Vervolgens aan het einde de query uit laten voeren.
 
Ik echo de strsql2 buiten mijn while en dan komt dit eruit:

CREATE TRIGGER upd_check AFTER UPDATE ON test1 FOR EACH ROW IF NEW.Test1 <> OLD.Test1 THEN INSERT INTO test1_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1) END IF IF NEW.Test1Test2 <> OLD.Test1Test2 THEN INSERT INTO test1_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1Test2, NEW.Test1Test2) END IF IF NEW.Test1Test2Test3 <> OLD.Test1Test2Test3 THEN INSERT INTO test1_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1Test2Test3, NEW.Test1Test2Test3) END IF IF NEW.Test1Test2Test3Test4 <> OLD.Test1Test2Test3Test4 THEN INSERT INTO test1_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1Test2Test3Test4, NEW.Test1Test2Test3Test4) END IF IF NEW.Test1Test2Test3Test4Test5 <> OLD.Test1Test2Test3Test4Test5 THEN INSERT INTO test1_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1Test2Test3Test4Test5, NEW.Test1Test2Test3Test4Test5) END IF

Kortom, hij telt dus vanaf de 2e, alle kolom namen bij elkaar op, wat niet echt de bedoeling denk ik..
 
Gebruik eens voor $strsql2 $cell in plaats van $re :)
 
Perfect! dit is precies wat ik nodig heb :)
Maar dan, hij doet helemaal niks.. ik had bedacht dat dit alles zou moeten zijn geweest, hoewel ik het vreemd vind dat het alleen wordt aangeroepen bij de create table ipv nog ergens bij iets wijzigen..
enig idee?

PHP:
$fileName = $_POST['name'];
$name = get_current_user();
$strsqlLog = "CREATE TABLE  `".$fileName."_logs` (id int(10) NOT NULL AUTO_INCREMENT, username VARCHAR(1000), oudeWaarde VARCHAR(1000), nieuweWaarde VARCHAR(1000), datumTijd VARCHAR(1000), KEY(id))";
$resultLogTable = mysql_query($strsqlLog);

$date = date('YmdHis');
$y = 1;
$strsql = "CREATE TABLE  `".$fileName."` (id int(10) NOT NULL AUTO_INCREMENT";
$strsql2 = "CREATE TRIGGER upd_check AFTER UPDATE ON ".$fileName." FOR EACH ROW";
while($y <= $sheet['numCols'])
{
	$x = 1;
	$cell = $sheet["cells"][$x][$y];
	$re .= $cell;
	$strsql2 .= " IF NEW.".$cell." <> OLD.".$cell." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell.") END IF";
	

	$data = array($cell);
	$x++;
	$strsql .= ", `".$data[0]."` VARCHAR(1000)";
	$y++;
}

$strsql .= ', KEY(id))';
$resultTable = mysql_query($strsql);
$resultTrigger = mysql_query($strsql2);
 
Laat de query van de trigger eens niet automatisch uitvoeren maar voer hem via phpMyAdmin o.i.d. in.

PHP:
$fileName = $_POST['name'];
$name = get_current_user();
$strsqlLog = "CREATE TABLE  `".$fileName."_logs` (id int(10) NOT NULL AUTO_INCREMENT, username VARCHAR(1000), oudeWaarde VARCHAR(1000), nieuweWaarde VARCHAR(1000), datumTijd VARCHAR(1000), KEY(id))";
$resultLogTable = mysql_query($strsqlLog);
 
$date = date('YmdHis');
$y = 1;
$strsql = "CREATE TABLE  `".$fileName."` (id int(10) NOT NULL AUTO_INCREMENT";
$strsql2 = "CREATE TRIGGER upd_check AFTER UPDATE ON ".$fileName." FOR EACH ROW";
while($y <= $sheet['numCols'])
{
    $x = 1;
    $cell = $sheet["cells"][$x][$y];
    $re .= $cell;
    $strsql2 .= " IF NEW.".$cell." <> OLD.".$cell." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell.") END IF";
    
 
    $data = array($cell);
    $x++;
    $strsql .= ", `".$data[0]."` VARCHAR(1000)";
    $y++;
}
 
$strsql .= ', KEY(id))';
$resultTable = mysql_query($strsql);
print_r($strsql2);
Nu krijg je hem als output, en die kun je kopieren en plakken.

Wanneer je hem uit laat voeren zul je waarschijnlijk via phpMyAdmin een foutmelding krijgen :)
 
#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'END IF IF NEW.Test2 <> OLD.Test2 THEN INSERT INTO test5_logs (oudeWaarde, nieuwe' at line 1
Dit is de foutmelding via phpmyadmin
 
Zo te horen zit er een fout in je string-opbouw.

Komt het resultaat overeen met het voorbeeld dat eerder wel werkte? Met name het gebruik van ";" ;)
 
Dit komt niet overeen aangezien ik heb vernomen dat mysql geen gebruik maakt van ';'.
Geen idee waarom, dit werkte één malig, en een paar minuten erna al niet meer. Wat er gebeurde geen idee, alsof er een bug of zo in zat..
Alles na gekeken en na gevraagd, schijnt niet te kunnen met mysql.. wel bijzonder dat het even werkte dan.. of ik moet ergens waardes in hebben gevuld en gedacht hebben dat het die wijziging is, het is en blijft me een raadsel..
 
Laatst bewerkt:
MySQL maakt wel gebruik van ";", dit zou gewoon moeten werken:

[sql]
UPDATE tabel SET waarde1 = "test";
SELECT * FROM tabel;
[/sql]
Als je die in één string laat uitvoeren worden beide zaken uitgevoerd.

In dit voorbeeld is GO het scheidingsteken maar wordt ";" wel gebruikt bij de IF-statements :)
[sql]
DELIMITER GO

CREATE TRIGGER upd_check AFTER UPDATE ON kees
FOR EACH ROW
BEGIN
IF OLD.firstName <> NEW.firstName THEN
INSERT INTO kees_logs (oudeWaarde, nieuweWaarde, datumTijd)
VALUES (OLD.firstName, NEW.firstName, NOW());
END IF;
END;
GO[/sql]

Het kan goed zijn dat door de eerste regel het standaard scheidingsteken is aangepast naar GO.
 
Oke... nu snap ik het niet helemaal meer.. niet handig dus twee bronnen van informatie -.-''

Kunnen we samen verder bouwen op wat ik als laatst had als voorbeeld?
Dus inclusief de $cell etc..

PHP:
$strsql2 = "DELIMETER GO CREATE TRIGGER upd_check AFTER UPDATE ON ".$fileName." FOR EACH ROW BEGIN";
$strsql2 .= " IF NEW.".$cell." <> OLD.".$cell." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell."); END IF; END; GO";

Hier komt het dus op neer?
 
Probeer dit eens :)
PHP:
$strsql2 = "DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON ". $fileName ." FOR EACH ROW BEGIN";
while($y <= $sheet['numCols'])
{
    $x = 1;
    $cell = $sheet["cells"][$x][$y];
    $re .= $cell;
    $strsql2 .= " IF NEW.".$cell." <> OLD.".$cell." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell.") END IF;";
    
 
    $data = array($cell);
    $x++;
    $strsql .= ", `".$data[0]."` VARCHAR(1000)";
    $y++;
}
$strsql2 .= "END; GO";
 
Goedemorgen!
Sorry voor de late reactie.. maar dit komt eruit :

Error: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON test8 FOR EACH ROW BEGIN I' at line 1

code:
PHP:
$y = 1;
$strsql = "CREATE TABLE  `".$fileName."` (id int(10) NOT NULL AUTO_INCREMENT";
$strsql2 = "DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON ". $fileName ." FOR EACH ROW BEGIN";
while($y <= $sheet['numCols'])
{
	$x = 1;
	$cell = $sheet["cells"][$x][$y];
	$re .= $cell;
	$strsql2 .= " IF NEW.".$cell." <> OLD.".$cell." THEN INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell.") END IF;";
	
 
	$data = array($cell);
	$x++;
	$strsql .= ", `".$data[0]."` VARCHAR(1000)";
	$y++;
}
$strsql2 .= "END; GO";

$strsql .= ', KEY(id))';
$resultTable = mysql_query($strsql);
$resultTrigger = mysql_query($strsql2);
if($resultTrigger == FALSE)
{
	die('Error: '. mysql_error());
}

Als ik de $strsql2 echo krijg ik dit:
DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON test9 FOR EACH ROW BEGIN IF NEW.Test1 <> OLD.Test1 THEN INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1) END IF; IF NEW.Test2 <> OLD.Test2 THEN INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test2, NEW.Test2) END IF; IF NEW.Test3 <> OLD.Test3 THEN INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test3, NEW.Test3) END IF; IF NEW.Test4 <> OLD.Test4 THEN INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test4, NEW.Test4) END IF; IF NEW.Test5 <> OLD.Test5 THEN INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test5, NEW.Test5) END IF;END; GO
 
Laatst bewerkt:
Even geformatteerd zodat problemen wellicht duidelijk worden:
[sql]DELIMITER GO

CREATE TRIGGER upd_check AFTER UPDATE ON test9
FOR EACH ROW
BEGIN
IF NEW.Test1 <> OLD.Test1 THEN
INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1)
END IF;
IF NEW.Test2 <> OLD.Test2 THEN
INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test2, NEW.Test2)
END IF;
IF NEW.Test3 <> OLD.Test3 THEN
INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test3, NEW.Test3)
END IF;
IF NEW.Test4 <> OLD.Test4 THEN
INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test4, NEW.Test4)
END IF;
IF NEW.Test5 <> OLD.Test5 THEN
INSERT INTO test9_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test5, NEW.Test5)
END IF;
END;
GO[/sql]

Het enige dat mij opvalt is het missen van een ; aan het einde van de INSERT alleen krijg je daar de foutmelding niet over.
Wellicht heeft het juist te maken met de formattering, kwestie van nieuwe regels toevoegen :)

PHP:
$strsql2 = "DELIMITER GO". PHP_EOL . PHP_EOL ."CREATE TRIGGER upd_check AFTER UPDATE ON ". $fileName . PHP_EOL ." FOR EACH ROW ". PHP_EOL ."BEGIN". PHP_EOL;
while($y <= $sheet['numCols'])
{
    $x = 1;
    $cell = $sheet["cells"][$x][$y];
    $re .= $cell;
    $strsql2 .= "IF NEW.".$cell." <> OLD.".$cell." THEN". PHP_EOL ."INSERT INTO ".$fileName."_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.".$cell.", NEW.".$cell."); ". PHP_EOL ."END IF;". PHP_EOL;
    
 
    $data = array($cell);
    $x++;
    $strsql .= ", `".$data[0]."` VARCHAR(1000)";
    $y++;
}
$strsql2 .= "END;". PHP_EOL ."GO";
echo $strsql2;
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan