Data opslaan in mysql db vanuit aanpassing PHPGrid.

Status
Niet open voor verdere reacties.
Oke, ik doe me best het net zo duidelijk als jou neer te zetten haha, dit is de echo.

[sql]DELIMITER GO

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

De foutmelding als ik hem wel uitvoer:

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 test FOR EACH ROW B' at line 1
 
Is dat de letterlijke echo? Dus hetgeen je als output krijgt direct geplakt binnen [sql][/sql] :)

De vorige keer was het één lange tekstregel die terugkwam uit de code, die heb ik zelf geformatteerd om problemen inzichtelijk te krijgen.

Wellicht werkt op het eind nog de DELIMITER terugzetten:
PHP:
$strsql2 .= "END;". PHP_EOL ."GO" . PHP_EOL ."DELIMITER ;";
 
Enige wat ik eraan heb gedaan is het wat netter neer gezet, dit is dus de directe output, wat makkelijker leesbaar gemaakt..

We doen hem weer zo, dit is de echo:

DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON test FOR EACH ROW BEGIN IF NEW.Test1 <> OLD.Test1 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1); END IF; IF NEW.Test2 <> OLD.Test2 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test2, NEW.Test2); END IF; IF NEW.Test3 <> OLD.Test3 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test3, NEW.Test3); END IF; IF NEW.Test4 <> OLD.Test4 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test4, NEW.Test4); END IF; IF NEW.Test5 <> OLD.Test5 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test5, NEW.Test5); END IF; END; GO DELIMITER ;

En dit is de foutmelding:

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 test FOR EACH ROW B' at line 1
 
Hmm de output zou niet op één regel horen te verschijnen aangezien ik PHP_EOL tussendoor gebruik :confused:

Vervang dit:
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;
eens door dit:
PHP:
$strsql2 = "DELIMITER GO". "\r\n" . "\r\n" ."CREATE TRIGGER upd_check AFTER UPDATE ON ". $fileName . "\r\n" ." FOR EACH ROW ". "\r\n" ."BEGIN". "\r\n";

Als dan een deel van de tekstregel op meerdere regels verschijnen kun je de andere PHP_EOL's ook vervangen door "\r\n".
 
Er veranderd niks..

DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON test FOR EACH ROW BEGIN IF NEW.Test1 <> OLD.Test1 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1); END IF; IF NEW.Test2 <> OLD.Test2 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test2, NEW.Test2); END IF; IF NEW.Test3 <> OLD.Test3 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test3, NEW.Test3); END IF; IF NEW.Test4 <> OLD.Test4 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test4, NEW.Test4); END IF; IF NEW.Test5 <> OLD.Test5 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test5, NEW.Test5); END IF; END; GO DELIMITER ;
 
Wat gebruik je voor het outputten? echo, var_dump, print_r?

Probeer var_dump of print_r eens
 
Ik gebruikte een echo..

Met prin_r wordt het :

DELIMITER GO CREATE TRIGGER upd_check AFTER UPDATE ON test FOR EACH ROW BEGIN IF NEW.Test1 <> OLD.Test1 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test1, NEW.Test1); END IF; IF NEW.Test2 <> OLD.Test2 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test2, NEW.Test2); END IF; IF NEW.Test3 <> OLD.Test3 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test3, NEW.Test3); END IF; IF NEW.Test4 <> OLD.Test4 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test4, NEW.Test4); END IF; IF NEW.Test5 <> OLD.Test5 THEN INSERT INTO test_logs (oudeWaarde, nieuweWaarde) VALUES (OLD.Test5, NEW.Test5); END IF; END; GO DELIMITER ;

Met var_dump komt daar alleen string(799) voor en de rest blijft hetzelfde.
 
Het is opgelost, dankje voor je hulp, we waren er bijna!

Ik moest de trigger in 2e splitsen omdat de waardes in de while moesten maar de VALUE daar niet tussen hoor te staan, want dan krijg je te vaak VALUE in je sql code..
 
Mooi dat het opgelost is, zou je de uiteindelijke code nog kunnen plaatsen? Ik heb nog niet echt een beeld van wat nu de wijziging is geweest :)
 
De uiteindelijke code

PHP:
$TableCreate     = "CREATE TABLE  `".$fileName."` ( id int(10) NOT NULL AUTO_INCREMENT";
$TableCreate      = "CREATE TABLE  `".$fileName."_logs` ( id int(10) NOT NULL AUTO_INCREMENT";
$Create       = "";
$CreateStart  = "CREATE TRIGGER upd_check".$fileName." AFTER UPDATE ON ".$fileName." FOR EACH ROW INSERT INTO ".$fileName."_logs ";
$CreateFields = "(";
$CreateValues = " VALUES (";


while($y <= $sheet['numCols'])
{
	$x = 1;
	$cell = $sheet["cells"][$x][$y];
	$re .= $cell;
	$data = array($cell);
	$TableCreate     .= ", `".$data[0]."` VARCHAR(1000)";
	$TableCreate      .= ", `".$data[0]."_oud` VARCHAR(1000), `".$data[0]."_nieuw` VARCHAR(1000)";
	$CreateFields .= " `".$data[0]."_oud`, `".$data[0]."_nieuw`, ";
	$CreateValues .= " OLD.".$data[0].", NEW.".$data[0].", ";
	$y++;
}

$TableCreate     .= ", KEY(id))";   // table now complete..
$TableCreate      .= ", DateTimeCreated VARCHAR(1000), KEY(id))";   // Log table now complete..
$CreateFields .= " `DateTimeCreated` )";  
$CreateValues .= " now() )";
$Create = $CreateStart.$CreateFields.$CreateValues;  // Tigger now complete

$resultTable = mysql_query($TableCreate);
$resultLogTable = mysql_query($LogCreate);
$resultTrigger = mysql_query($Create);
 
Je weet dat je $TableCreate op regel 2 overschrijft?

Daarnaast wordt er nu bij elke update een volledige insert van alle kolommen gedaan, ongeacht of er wat gewijzigd is toch?
 
Dat is fout gegaan in de naam aanpassing voor hier :p mijn fout, dat overschrijven gebeurd in de code niet..
Dat hij het altijd doet ongeacht een aanpassing klopt.. daarvoor was het if statement, maar dit werd hier als onnodig beschouwd, ben nu opzoek naar hoe ik de windows username kan krijgen, als dit is gelukt, dan ga ik er nog inbouwen dat het alleen gebeurd als de waarde veranderd is.

Bedankt voor je feedback, wellicht heb je een idee over die username in mijn andere topic (A)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan