abonnement bol.com Unibet Coolblue
  FOK!-Schrikkelbaas zaterdag 1 augustus 2015 @ 22:04:56 #1
862 Arcee
Look closer
pi_154828188


Als je vragen hebt over PHP/MySQL, dan zit je hier goed met een vaste kliek guru's en een groot aantal regelmatige bezoekers. Beperk je vragen niet tot "hij doet het niet" of "hij geeft een fout" - onze glazen bol is kapot en we willen graag van je weten wát er niet lukt en wélke foutmelding je precies krijgt :)

Zie ook:
PHP Dataverwerking
Officiële PHP website
PHP Documentatie
MySQL Reference Manual
Yet Another PHP Faq
PHP Cheat Sheet
PHP5 Power Programming - boek met uitleg over OOP, Pear, XML, etc

Tutorials:
W3Schools PHP
W3Schools SQL
  FOK!-Schrikkelbaas zaterdag 1 augustus 2015 @ 22:06:11 #2
862 Arcee
Look closer
pi_154828217
quote:
0s.gif Op zaterdag 1 augustus 2015 22:03 schreef jodelahity het volgende:
Ja alles wordt gewoon toegevoegd. Alleen het wordt toegevoegd aan de database voordat het gevalideerd wordt. Dus ook 'test' komt als e-mail erin terwijl dat eigenlijk alleen 'test@hotmail.com' zou moeten zijn bijvoorbeeld.
Zou eventueel aan je php-versie kunnen liggen of wellicht heb je toch nog iets anders als hoe ik het heb. Voeg anders gewoon de code van toevoegen.php toe aan die van input.php.

Dus input.php wordt dan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
<?php

$servername = "localhost";
$username = "root";
$password = "***";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}

if(isset($_POST["submit"])) {

$naam=$_POST['naam'];
$email=$_POST['email'];
$website=$_POST['website'];
$comment=$_POST['comment'];

   if (empty($_POST["naam"])) {
     $naamErr = "Het invullen van een naam is noodzakelijk";
   } else {
     $naam = test_input($_POST["naam"]);
     // check if naam only contains letters and whitespace
     if (!preg_match("/^[a-zA-Z ]*$/",$naam)) {
       $naamErr = "Alleen letters en spaties zijn toegestaan";
     }
   }
  
   if (empty($_POST["email"])) {
     $emailErr = "Een e-mail adres is noodzakelijk";
   } else {
     $email = test_input($_POST["email"]);
     // check if email address is well-formed
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
       $emailErr = "Geen kloppend e-mail formaat";
     }
   }
    
   if (empty($_POST["website"])) {
     $website = "";
   } else {
     $website = test_input($_POST["website"]);
     // check if URL address syntax is valid (this regular expression also allows dashes in the URL)
     if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
       $websiteErr = "Ongeldig websiteformaat";
     }
   }

   if (empty($_POST["comment"])) {
     $comment = "";
   } else {
     $comment = test_input($_POST["comment"]);
   }

if ($naamErr=='' and $emailErr=='' and $websiteErr=='') {

$sql = $conn->prepare("INSERT INTO gebruikerscompleet (naam, email, website, comment)
VALUES (?, ?, ?, ?)");
$sql->bind_param('ssss', $naam, $email, $website, $comment);

if (!$sql->execute()) {
    echo "Error: " . $sql->error;
} else {
    echo "Succesvol toegevoegd";
}
}
}

$conn->close();

?> 

En dan <?php include 'toevoegen.php';?> uit het formulier halen.
pi_154836229
quote:
0s.gif Op zaterdag 1 augustus 2015 22:06 schreef Arcee het volgende:

[..]

Zou eventueel aan je php-versie kunnen liggen of wellicht heb je toch nog iets anders als hoe ik het heb. Voeg anders gewoon de code van toevoegen.php toe aan die van input.php.

Dus input.php wordt dan:
[ code verwijderd ]

En dan <?php include 'toevoegen.php';?> uit het formulier halen.
Mijn php versie is 5.5.12

Ik heb die code geprobeerd en krijg dan het volgende



Ik heb nu de volgende code tijdelijk weer (wel input.php en toevoegen.php)

input.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
// define variables and set to empty values
$naamErr = $emailErr = $websiteErr = "";
$naam = $email = $comment = $website = "";

if ($_SERVER["REQUEST_METHOD"] == "POST") {
   if (empty($_POST["naam"])) {
     $naamErr = "Het invullen van een naam is noodzakelijk";
   } else {
     $naam = test_input($_POST["naam"]);
     // check if naam only contains letters and whitespace
     if (!preg_match("/^[a-zA-Z ]*$/",$naam)) {
       $naamErr = "Alleen letters en spaties zijn toegestaan";
     }
   }
  
   if (empty($_POST["email"])) {
     $emailErr = "Een e-mail adres is noodzakelijk";
   } else {
     $email = test_input($_POST["email"]);
     // check if email adadress is well-formed
     if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
       $emailErr = "Geen kloppend e-mail formaat";
     }
   }
    
   if (empty($_POST["website"])) {
     $website = "";
   } else {
     $website = test_input($_POST["website"]);
     // check if URL address syntax is valid (this regular expression also allows dashes in the URL)
     if (!preg_match("/\b(?:(?:https?|ftp):\/\/|www\.)[-a-z0-9+&@#\/%?=~_|!:,.;]*[-a-z0-9+&@#\/%=~_|]/i",$website)) {
       $websiteErr = "Ongeldig websiteformaat";
     }
   }

   if (empty($_POST["comment"])) {
     $comment = "";
   } else {
     $comment = test_input($_POST["comment"]);
   }

  
}

function test_input($data) {
   $data = trim($data);
   $data = stripslashes($data);
   $data = htmlspecialchars($data);
   return $data;
}
?>

Toevoegen.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

$servername = "localhost";
$username = "root";
$password = "noeska";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Onderstaande stukje heb ik toegevoegd
if(isset($_POST["submit"]) and $naamErr=='' and $emailErr=='' and $websiteErr=='') {

$naam=$_POST['naam'];
$email=$_POST['email'];
$website=$_POST['website'];
$comment=$_POST['comment'];

$sql = $conn->prepare("INSERT INTO gebruikerscompleet (naam, email, website, comment)
VALUES (?, ?, ?, ?)");
$sql->bind_param('ssss', $naam, $email, $website, $comment);

if ($conn->query($sql) === TRUE) {
    echo "Succesvol toegevoegd";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}

}

$conn->close();

?> 

En krijg nu deze foutmelding na het verzenden



Dit gaat over

1
2
3
4
if ($conn->query($sql) === TRUE) {    // lijn 31
    echo "Succesvol toegevoegd";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error; // lijn 34


Dit stukje moet aangepast worden omdat ik nu dat 'prepare en bind' statement gebruik?
Hij stuurt op dit moment niks naar de database trouwens, ook niet als de ingevoerde gegevens kloppen

Deze 2 foutmeldingen komen trouwens pas als de ingevoerde gegevens kloppen. Dat is sowieso al een stap in de goede richting. Als de gegevens niet kloppen dan gaat het niet naar de database, het lijkt me dat als ik deze 2 foutmeldingen weg krijg het wel gestuurd wordt en het klopt (ook omdat die 2 meldingen betrekking hebben op het gedeelte over of het goed verstuurd is of juist niet).

Ben zelf nu op zoek naar die foutmeldingen, misschien lukt het me toch

quote:
You are mixing mysqli and mysql extensions, which will not work.
Zal hier goed naar kijken

Ik probeer nu met stmt dingen voor elkaar te krijgen, nog zonder succes tot nu toe.

o.a.

1$stmt->execute();

Het zit hem wel echt in het volgende stukje waar iets niet klopt (blijkbaar)

1
2
3
4
5
 if ($conn->query($sql) === TRUE) {
     echo "Succesvol toegevoegd";
 } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
}

Als het e-mail adres, naam enzovoort niet correct zijn ingevuld wordt het ook niet verstuurd. Maar als het wel klopt en op submit geklikt wordt krijg ik die 2 foutmeldingen en wordt het ook niet in de database opgeslagen. De afhandeling van die info moet nog goed gebeuren en zit in dat stukje code vast blijkbaar. Ook al dingen geprobeerd met mysqli en zit nu gewoon door te zoeken :P Maar als iemand weet hoe het op te lossen valt dan hoor ik dat heel graag :)

[ Bericht 4% gewijzigd door jodelahity op 02-08-2015 09:11:08 ]
Fylax is op televisie geweest
pi_154836680
De foutcodes (zodat die gekopieerd kunnen worden)
quote:
Warning: mysqli::query() expects parameter 1 to be string, object given in
Catchable fatal error: Object of class mysqli_stmt could not be converted to string in
Ik zoek o.a. bij stackoverflow hierop maar is nog niet gelukt (ook al zijn er wel veel zoekresultaten voor deze foutmeldingen)
Heb execute, close enzovoort uitgeprobeerd, gecontroleerd of het code is voor mysqli ook, lukt me nog niet

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
<?php

$servername = "localhost";
$username = "root";
$password = "***";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// Onderstaande stukje heb ik toegevoegd
if(isset($_POST["submit"]) and $naamErr=='' and $emailErr=='' and $websiteErr=='') {

$naam=$_POST['naam'];
$email=$_POST['email'];
$website=$_POST['website'];
$comment=$_POST['comment'];

$sql = $conn->prepare("INSERT INTO gebruikerscompleet (naam, email, website, comment)
VALUES (?, ?, ?, ?)");
$sql->bind_param('ssss', $naam, $email, $website, $comment);

 if ($conn->query($sql) === TRUE) { // [b]dit is de eerste lijn waar het over gaat[/b]
     echo "Succesvol toegevoegd";
 } else {
     echo "Error: " . $sql . "<br>" . $conn->error; // [b]dit is de tweede lijn waar het over gaat[/b]
}

}

$conn->close();

?> 

Validatie werkt dus, alleen het versturen na de validatie (als de gegevens goed zijn ingevuld) lukt nog niet.

Het gaat daarbij dus om dit stukje code

1
2
3
4
5
 if ($conn->query($sql) === TRUE) { 
     echo "Succesvol toegevoegd";
 } else {
     echo "Error: " . $sql . "<br>" . $conn->error;
}
Fylax is op televisie geweest
  FOK!-Schrikkelbaas zondag 2 augustus 2015 @ 09:37:07 #5
862 Arcee
Look closer
pi_154836707
quote:
0s.gif Op zondag 2 augustus 2015 09:34 schreef jodelahity het volgende:
Validatie werkt dus, alleen het versturen na de validatie (als de gegevens goed zijn ingevuld) lukt nog niet.

Het gaat daarbij dus om dit stukje code
[ code verwijderd ]
quote:
0s.gif Op zondag 2 augustus 2015 09:34 schreef jodelahity het volgende:
Validatie werkt dus, alleen het versturen na de validatie (als de gegevens goed zijn ingevuld) lukt nog niet.

Het gaat daarbij dus om dit stukje code
[ code verwijderd ]
Vervang dat eens weer door:

1
2
3
4
if (!$sql->execute()) {
    echo "Error: " . $sql->error;
} else {
    echo "Succesvol toegevoegd";

Als dat niet werkt zou je jouw stuk weer terug kunnen zetten en dan onderstaande stuk:

1
2
3
$sql = $conn->prepare("INSERT INTO gebruikerscompleet (naam, email, website, comment)
VALUES (?, ?, ?, ?)");
$sql->bind_param('ssss', $naam, $email, $website, $comment);

Vervangen door:

1
2
$sql = "INSERT INTO gebruikerscompleet (naam, email, website, comment)
  VALUES ('$naam', '$email', '$website', '$comment')";

Maar de eerste optie is waarschijnlijk beter.

[ Bericht 15% gewijzigd door Arcee op 02-08-2015 09:48:27 ]
pi_154836875
quote:
0s.gif Op zondag 2 augustus 2015 09:37 schreef Arcee het volgende:
if (!$sql->execute()) {
echo "Error: " . $sql->error;
} else {
echo "Succesvol toegevoegd";
Zo ontzettend bedankt _O_

Bedoel ik zoek echt zoveel en probeer zoveel uit van wat ik lees maar dit was ik niet zo tegengekomen en de rest werkt niet. Nu zal ik vandaag en morgen niet echt meer een vraag hoeven te stellen hierover :P Formulier werkt, connectie en validatie dus nu kan ik bezig gaan met SELECT, UPDATE en alles :P Maar dat heb ik eerder al getest en dat werkte dus nu ben ik wel zoet ermee om daarmee wat mooie dingen te maken en de opmaak met css enzovoort te regelen :)

Ik leer de basis die ik nog niet ken nog wel bij trouwens zoals 'waarom !$sql daar' bijvoorbeeld. Maar dit was even heel belangrijk omdat ik nu goed de sql codes kan uitproberen.

Jij bent trouwens professioneel webdeveloper neem ik aan als baan?

[ Bericht 4% gewijzigd door jodelahity op 02-08-2015 10:00:03 ]
Fylax is op televisie geweest
  FOK!-Schrikkelbaas zondag 2 augustus 2015 @ 10:00:05 #7
862 Arcee
Look closer
pi_154836939
quote:
0s.gif Op zondag 2 augustus 2015 09:54 schreef jodelahity het volgende:
Zo ontzettend bedankt _O_

Bedoel ik zoek echt zoveel en probeer zoveel uit van wat ik lees maar dit was ik niet zo tegengekomen
Jawel hoor. ;) Probleem was dat je 2 verschillende methodes door elkaar gebruikte. :) Je had de prepare wel overgenomen, maar de bijbehorende execute niet. Prepare hoort dus bij execute en $sql = "... hoort bij jouw stukje ($conn->query($sql)).
  FOK!-Schrikkelbaas zondag 2 augustus 2015 @ 10:00:41 #8
862 Arcee
Look closer
pi_154836948
quote:
0s.gif Op zondag 2 augustus 2015 09:54 schreef jodelahity het volgende:
Ik leer de basis die ik nog niet ken nog wel bij trouwens zoals 'waarom !$sql daar' bijvoorbeeld. Maar dit was even heel belangrijk omdat ik nu goed de sql codes kan uitproberen.
Die ! is gewoon een 'not', dus die test of de execute() correct is uitgevoerd of niet. execute() geeft dus een true of false terug.
  FOK!-Schrikkelbaas zondag 2 augustus 2015 @ 10:07:42 #9
862 Arcee
Look closer
pi_154837009
En fijn dat de valdatie nu werkt. Wat er niet goed was eerst was dat je wel alles testte, maar dat je vervolgens niks met het resultaat deed. Vandaar dus de and $naamErr=='' and $emailErr=='' and $websiteErr=='' toegevoegd. Dat kan trouwens wel eleganter (1 variabele gebruiken die het totaal test), maar zo werkt het ook. :)

Succes met verdere mooie dingen maken. ^O^
pi_154837097
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php
$servername = "localhost";
$username = "root";
$password = "***";
$dbname = "myDB";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}

// sql to create table
$sql = "CREATE TABLE userinfo (
naam VARCHAR(40),
email VARCHAR(50),
website VARCHAR(40),
comment VARCHAR(400),
)";

if ($conn->query($sql) === TRUE) {
    echo "Table userinfo created successfully";
} else {
    echo "Error creating table: " . $conn->error;
}

$conn->close();
?> 

Ik had verwacht dat ik nu ook gewoon op deze manier een table kon aanmaken :{ Werkte eerst wel, maar nu na prepare and bind niet meer lijkt me?

1Error creating table: 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 ')' at line 6 

Eerst lukte het me wel om op die manier het aan te maken namelijk voor zover ik weet. Lijn 6 is ook leeg.

En dank je, ook voor de uitleg weer :) ik doe mijn best maar het is niet zo simpel :P
Fylax is op televisie geweest
pi_154837108
quote:
0s.gif Op zondag 2 augustus 2015 10:17 schreef jodelahity het volgende:

[ code verwijderd ]

Ik had verwacht dat ik nu ook gewoon op deze manier een table kon aanmaken :{ Werkte eerst wel, maar nu na prepare and bind niet meer lijkt me?
[ code verwijderd ]

Eerst lukte het me wel om op die manier het aan te maken namelijk voor zover ik weet.

En dank je, ook voor de uitleg weer :) ik doe mijn best maar het is niet zo simpel :P
Door de komma op regel 20 verwacht MySQL nog een waarde.
Probeer die 'ns weg te halen.
Be curious, not judgmental
  FOK!-Schrikkelbaas zondag 2 augustus 2015 @ 10:19:31 #12
862 Arcee
Look closer
pi_154837111
quote:
0s.gif Op zondag 2 augustus 2015 10:17 schreef jodelahity het volgende:
Ik had verwacht dat ik nu ook gewoon op deze manier een table kon aanmaken :{ Werkte eerst wel, maar nu na prepare and bind niet meer lijkt me?

$sql = "CREATE TABLE userinfo (
naam VARCHAR(40),
email VARCHAR(50),
website VARCHAR(40),
comment VARCHAR(400),
)";

Die laatste komma weghalen. :)
pi_154837118
Werkte :) Voelt wat dom aan maar ja :@ Beginnersfoutjes

Nu net gelukkig zelf wat opgelost een keer xd create table werkte nu, DELETE table niet, kom ik gelukkig er wel achter dat het DROP table moet zijn. Zoiets moet je maar net weten :P

[ Bericht 36% gewijzigd door jodelahity op 02-08-2015 10:37:16 ]
Fylax is op televisie geweest
  dinsdag 4 augustus 2015 @ 22:28:38 #14
91039 mstx
2x1/2 = 1/2 x 1/2
pi_154910326
Ik heb een raar probleempje bij een MySQL tabel. Ik wil een kolom een unique index geven, maar op het moment dat ik dat doe geeft hij een duplicate key error.
1#1062 - Duplicate entry 'b' for key 'a' 
Waarbij waarde "b" altijd de waarde in de laatste rij is, en die komt niet vaker voor in de tabel. Als ik die rij verwijder geeft hij daarna weer dezelfde fout maar dan met de waarde die op dat moment in de "nieuwe" laatste rij staat. :')
Iemand een idee? :?
Op donderdag 2 juli 2009 22:41 schreef RTB het volgende:
als ik elk rap"liedje" een kans moest geven was ik aan het eind van dit millennium nog bezig met het tempo waarin die kotshoop uitgebraakt wordt.
👾
pi_154910795
quote:
0s.gif Op dinsdag 4 augustus 2015 22:28 schreef mstx het volgende:
Ik heb een raar probleempje bij een MySQL tabel. Ik wil een kolom een unique index geven, maar op het moment dat ik dat doe geeft hij een duplicate key error.
[ code verwijderd ]

Waarbij waarde "b" altijd de waarde in de laatste rij is, en die komt niet vaker voor in de tabel. Als ik die rij verwijder geeft hij daarna weer dezelfde fout maar dan met de waarde die op dat moment in de "nieuwe" laatste rij staat. :')
Iemand een idee? :?
Ik heb niet echt een idee, maar helpt het als je een purge probeert? En heb je je index wel juist toegevoegd?
pi_154934101
Fuck it, net forms gemaakt zonder de ingebouwde form handling van Symfony, maar wel met de routing-mogelijkheden en dergelijke. Dat gaat prima. _O_

Serieus, fuck die frameworks soms. Soms ben je zo lang bezig met vinden hoe je iets op de beste manier in zo'n framework kunt doen dat ik mezelf af begin te vragen of dit niet gewoon werkverschaffing is.

Soms ben je anders wel het wiel opnieuw aan het uitvinden als je geen frameworks gebruikt, dat is dan weer de andere kant. Plus je wordt niet echt door enige structuur gestuurd.

[ Bericht 4% gewijzigd door #ANONIEM op 05-08-2015 18:53:43 ]
pi_155012036
quote:
0s.gif Op woensdag 5 augustus 2015 18:53 schreef robin007bond het volgende:
Fuck it, net forms gemaakt zonder de ingebouwde form handling van Symfony, maar wel met de routing-mogelijkheden en dergelijke. Dat gaat prima. _O_

Serieus, fuck die frameworks soms. Soms ben je zo lang bezig met vinden hoe je iets op de beste manier in zo'n framework kunt doen dat ik mezelf af begin te vragen of dit niet gewoon werkverschaffing is.

Soms ben je anders wel het wiel opnieuw aan het uitvinden als je geen frameworks gebruikt, dat is dan weer de andere kant. Plus je wordt niet echt door enige structuur gestuurd.
Een framework is er om werk uit handen te nemen, dus als het formbuilder gedeelte van symfony2 je niet bevalt, lekker weg laten of wat anders gebruiken :).
pi_155012764
quote:
19s.gif Op zaterdag 8 augustus 2015 13:43 schreef TwenteFC het volgende:

[..]

Een framework is er om werk uit handen te nemen, dus als het formbuilder gedeelte van symfony2 je niet bevalt, lekker weg laten of wat anders gebruiken :).
Daar heb je een goed punt.

Het form-gedeelte is oké voor simpele forms, maar als het complexer wordt dan is het niet echt de meest handige oplossing.

Ik heb het gevoel alsof de meeste frameworks het meest zijn gericht op simpele CRUD-operaties en dat complexere problemen vaak worden bemoeilijkt. ;(
pi_155298208
weet iemand trouwens of het mogelijk is om in de query cache van mysql te kijken, om te zien welke queries in de cache zitten?
..///
pi_155301771
quote:
0s.gif Op maandag 17 augustus 2015 17:28 schreef wipes66 het volgende:
weet iemand trouwens of het mogelijk is om in de query cache van mysql te kijken, om te zien welke queries in de cache zitten?
Wat wil je hiermee precies bereiken?
pi_155302363
quote:
19s.gif Op maandag 17 augustus 2015 19:16 schreef TwenteFC het volgende:

[..]

Wat wil je hiermee precies bereiken?
gewoon nieuwsgierig of het uberhaupt kan :P
..///
pi_155302481
quote:
0s.gif Op maandag 17 augustus 2015 19:35 schreef wipes66 het volgende:

[..]

gewoon nieuwsgierig of het uberhaupt kan :P
Volgens mij worden enkel hashes voor betreffende queries opgeslagen, niet de queries zelf.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  Moderator / Redactie Sport / Devops maandag 17 augustus 2015 @ 20:00:32 #23
176766 crew  zoem
zoemt
pi_155303218
quote:
1s.gif Op zaterdag 8 augustus 2015 14:12 schreef robin007bond het volgende:

[..]

Daar heb je een goed punt.

Het form-gedeelte is oké voor simpele forms, maar als het complexer wordt dan is het niet echt de meest handige oplossing.

Ik heb het gevoel alsof de meeste frameworks het meest zijn gericht op simpele CRUD-operaties en dat complexere problemen vaak worden bemoeilijkt. ;(
Mee eens dat een beetje complex formulier al snel niet meer binnen het standaard raamwerk van formulierbuilders valt. Dan moet je je vaak in allerlei bochten wringen om het werkend of performant te krijgen. Op een gegeven moment wordt het een spaghetti van hacks of wordt het geheel zo log dat het niet fatsoenlijk onderhoudbaar en leesbaar meer is. Dus in zulke gevallen maak ik zelf liever een opzet.
pi_155303452
quote:
0s.gif Op maandag 17 augustus 2015 20:00 schreef zoem het volgende:

[..]

Mee eens dat een beetje complex formulier al snel niet meer binnen het standaard raamwerk van formulierbuilders valt. Dan moet je je vaak in allerlei bochten wringen om het werkend of performant te krijgen. Op een gegeven moment wordt het een spaghetti van hacks of wordt het geheel zo log dat het niet fatsoenlijk onderhoudbaar en leesbaar meer is. Dus in zulke gevallen maak ik zelf liever een opzet.
Precies. Dat heb ik nu wel in een harde les geleerd. ;(

Soms dan denk ik echt: "Als ze dit en dit nou zouden doen, dan zou dat al een héél stuk schelen". Maar ja, misschien dat ik me wat meer met de ontwikkeling van een van de frameworks moet gaan bemoeien. :P

[ Bericht 13% gewijzigd door #ANONIEM op 17-08-2015 20:07:05 ]
pi_155756151
Hey beste mensen, het is ondertussen weer een paar weken verder en ik zit vast op iets anders nu.

Ik heb producten (afbeeldingen) uit een database gehaald, deze zijn zichtbaar, ik heb ze op de volgende manier een id meegegeven:

1
2
3
4
5
      <div id=\"webshopmaindiv\"> 
             
                <a href=\"javascript:ajaxpage('webshop/navigatiewebshop2.php?navigatie_ID = " . $row['navigatie_ID'] ."', 'webshopmaindiv2');\"><img alt=".$row['productnaam']." height=\"100px\" width=\"100px\" src=".$row['afbeelding']." /></a>
        "   ?>; 
                </div> 


Ik neem aan dat dit kan op deze manier? (navigatie_ID is een kolom die auto increment heeft in de database)

Nu probeer ik bij het php bestand navigatiewebshop2.php dit meegegeven ID op te pakken, maar dit lukt me niet.



En de code

1
2
3
4
5
6
7
8
9
10
<?php
// Get data from the database depending on the value of the id in the URL
    $sql = "SELECT * FROM navigatie WHERE navigatie_ID=" . $_GET["navigatie_ID"];
    $rs = $conn->query($sql);
    
    while($row = $result->fetch_assoc()) {

        // Write the data of the person
        echo "<dt>ID en productnaam</dt><dd>" . $row["navigatie_ID"] . " " . $row["productnaam"] . "</dd>";
    }

Ik weet dat de lay-out enzovoort bagger is. Ik wil gewoon eerst bepaalde dingen voor elkaar krijgen en dan zet ik het wel met CSS netjes en normaal. Maar hoe moet ik ervoor zorgen dat het gewoon lukt wat ik wil? Bij navigatiewebshop2.php alle informatie die bij het doorgestuurde navigatie_ID horen tonen.

Verder werkt de alt bij de image ook niet, als iemand weet hoe dat kan hoor ik het ook graag.

Alvast bedankt :)

Gewoon een goede tutorial hierover is ook goed trouwens. Maar wat ik heb opgezocht en geprobeerd heeft niet gewerkt (omdat ik het dus gewoon fout doe blijkbaar maar ja)
Fylax is op televisie geweest
pi_155756275
1
2
$sql = "SELECT * FROM navigatie WHERE navigatie_ID=" . $_GET["navigatie_ID"];
    $rs = $conn->query($sql);

_O- je maakt een grapje toch hoop ik?
pi_155756329
Ja ik zit al uren en uren lol te hebben met zoeken en uitproberen
Fylax is op televisie geweest
pi_155756465
Nouja de foutmelding laat weinig te raden over toch? Je GET-variable bestaat niet.

Maar ga je eerst eens inlezen in SQL injecties en prepared statements, want je hebt echt véél grotere problemen dan een get-variable die niet geset is.
pi_155756511
sql injecties en prepared statements weet ik juist al vanaf. Is ook gewoon goed opgezet. Maar ik bouw dit stukje gewoon om dit klaar te hebben en dan voeg ik dat daarna weer toe (zit gewoon op localhost via wamp dus dat van beveiliging maakt niet uit nu).

En nou ja ik zal maar proberen om mijn get variabele dan goed te zetten. Althans ik neem aan dat het daarna kan werken? Heb vanuit een formulier ook de gegevens in een database gezet, gevalideerd en terugge-echod dus ik zou denken dat dit me enigszins moet lukken. Maar ik krijg het gewoon niet voor elkaar ;(
Fylax is op televisie geweest
pi_155756611
quote:
0s.gif Op woensdag 2 september 2015 13:08 schreef jodelahity het volgende:
sql injecties en prepared statements weet ik juist al vanaf. Is ook gewoon goed opgezet. Maar ik bouw dit stukje gewoon om dit klaar te hebben en dan voeg ik dat daarna weer toe (zit gewoon op localhost via wamp dus dat van beveiliging maakt niet uit nu).
Maar waarom ga je eerst klooien op de meest foute manier om SQL queries te doen in PHP en het vervolgens weer 'ombouwen'? Je gaat toch ook niet eerst een huis van klein en stro bouwen om het vervolgens weer plat te gooien en op te bouwen met stenen en cement?
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_155756685
quote:
0s.gif Op woensdag 2 september 2015 13:14 schreef Monolith het volgende:

[..]

Maar waarom ga je eerst klooien op de meest foute manier om SQL queries te doen in PHP en het vervolgens weer 'ombouwen'? Je gaat toch ook niet eerst een huis van klein en stro bouwen om het vervolgens weer plat te gooien en op te bouwen met stenen en cement?
Vooral omdat ik het idee heb voor mezelf dat als ik die dingen eerst weglaat de code voor mij wat overzichtelijker is en ik me daar geen zorgen over hoef te maken sowieso.

Bedoel nu heb ik de 2 afbeeldingen van de schep uit de database gehaald en getoond, navigatie_ID zit er blijkbaar aan vast, en nu weet ik dat ik in de vervolgstap dus iets verkeerd doe. Terwijl als ik andere codes erbij zou doen (ook al werken ze) ik na uren eerder zou kunnen twijfelen of er toch niet ook iets mis is met die codes.. vandaar (althans dat is wat ik zo doe omdat het me wel oke leek).

Ben trouwens een totale leek wat betreft php, dus ik begrijp dat de codering die ik toonde nogal belabberd kan zijn. Maar ik heb gewoon zoveel verschillende dingen geprobeerd die ik op internet las en die me niet gelukt zijn dat dit de code was waarmee ik achterbleef toen ik besloot om het hier maar te vragen.

1 van die foutmeldingen (conn) is weg, was gewoon vergeten om de databaseconnectie er te includen. Hoe ik die navigatie_ID eruit moet halen en op kan zoeken in de database (naar de bijbehorende informatie) probeer ik nu uit te zoeken
Fylax is op televisie geweest
pi_155756825
quote:
0s.gif Op woensdag 2 september 2015 13:18 schreef jodelahity het volgende:

[..]

Vooral omdat ik het idee heb voor mezelf dat als ik die dingen eerst weglaat de code voor mij wat overzichtelijker is en ik me daar geen zorgen over hoef te maken sowieso.

Dan ben je waarschijnlijk de eerste mens ter wereld die concatenaten overzichtelijker vindt dan parameteriseren...
pi_155756910
quote:
14s.gif Op woensdag 2 september 2015 13:25 schreef KomtTijd... het volgende:

[..]

Dan ben je waarschijnlijk de eerste mens ter wereld die concatenaten overzichtelijker vindt dan parameteriseren...
Ik geloof best wel dat ik dom bezig ben hoor :P Ben gewoon lerende en zal straks ook wel denken van 'ow jezus dat ik dat toen zo deed'



Heb na de volgende code nog deze foutmelding

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Zal nog doorzoeken maar als iemand een hint heeft is die welkom :P
Fylax is op televisie geweest
pi_155757006
quote:
0s.gif Op woensdag 2 september 2015 13:29 schreef jodelahity het volgende:

[..]

Ik geloof best wel dat ik dom bezig ben hoor :P Ben gewoon lerende en zal straks ook wel denken van 'ow jezus dat ik dat toen zo deed'
Denk het ook. Ga het maar zsm op deze manier doen, heb je in de toekomst veel profijt van:
http://php.net/manual/en/pdo.prepare.php
quote:
[ afbeelding ]

Heb na de volgende code nog deze foutmelding

[spoiler]
[ code verwijderd ]

[/spoiler]

Zal nog doorzoeken maar als iemand een hint heeft is die welkom :P
quote:
14s.gif Op woensdag 2 september 2015 13:05 schreef KomtTijd... het volgende:
Nouja de foutmelding laat weinig te raden over toch? Je GET-variable bestaat niet.

  woensdag 2 september 2015 @ 13:35:11 #35
85514 ralfie
!Yvan eht nioj
pi_155757025
hint staat op regel vijf
1
2
3
4
5
6
7
8
9
10
11
12
13
 <?php include '../webshop/DBconnectie.php'; ?>

<?php
// Get data from the database depending on the value of the id in the URL
$id = $_GET[DIT IS EEN INDEX];
    $sql = "SELECT * FROM navigatie WHERE navigatie_ID=' . $id . '";
    $result = $conn->query($sql);
    
    while($row = $result->fetch_assoc()) {

        // Write the data of the person
        echo "<dt>ID en productnaam</dt><dd>" . $row["navigatie_ID"] . " " . $row["productnaam"] . "</dd>";
    }
pi_155758089
Ik krijg het niet voor elkaar. Is het moeilijk om het te definiëren? Kan er toch gewoon even kort de code aangegeven worden? Zit hier ook al zeer lang mee te prutsen sowieso.
Fylax is op televisie geweest
  † In Memoriam † woensdag 2 september 2015 @ 14:14:37 #37
159966 lifeblind
pi_155758135
In je eerste screenshot (http://static.afbeeldinguploaden.nl/1509/119236/QkHjNax1.png), staat in de url

1?navigatie_ID = 2

haal die spaties meer eens weg, waarschijnlijk gaat ie daar al onderuit (waardoor navigatie_ID dus niet in je $_GET gevuld wordt met een value).
pi_155758351
quote:
0s.gif Op woensdag 2 september 2015 13:18 schreef jodelahity het volgende:

[..]

Vooral omdat ik het idee heb voor mezelf dat als ik die dingen eerst weglaat de code voor mij wat overzichtelijker is en ik me daar geen zorgen over hoef te maken sowieso.

Bedoel nu heb ik de 2 afbeeldingen van de schep uit de database gehaald en getoond, navigatie_ID zit er blijkbaar aan vast, en nu weet ik dat ik in de vervolgstap dus iets verkeerd doe. Terwijl als ik andere codes erbij zou doen (ook al werken ze) ik na uren eerder zou kunnen twijfelen of er toch niet ook iets mis is met die codes.. vandaar (althans dat is wat ik zo doe omdat het me wel oke leek).

Ben trouwens een totale leek wat betreft php, dus ik begrijp dat de codering die ik toonde nogal belabberd kan zijn. Maar ik heb gewoon zoveel verschillende dingen geprobeerd die ik op internet las en die me niet gelukt zijn dat dit de code was waarmee ik achterbleef toen ik besloot om het hier maar te vragen.

1 van die foutmeldingen (conn) is weg, was gewoon vergeten om de databaseconnectie er te includen. Hoe ik die navigatie_ID eruit moet halen en op kan zoeken in de database (naar de bijbehorende informatie) probeer ik nu uit te zoeken
Als je aan het hobbyen bent prima, maar 'een beetje aanklooien' is doorgaans een hele verkeerde manier om een taal te leren. Sowieso is het wel raadzaam om gelijk te beginnen met een goed framework in PHP. Die hebben doorgaans de standaard best-practices en architecturele patronen als MVC, dependency injection, enzovoort geïmplementeerd. De quick-and-dirty wijze van procedureel programmeren die vaak in PHP wordt gehanteerd levert op de iets langere termijn vaak een onbeheersbare teringbende op.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_155758424
Ik zal me eerst weer wat extra bezig gaan houden met de basis, hierna :P

Maar bedankt iedereen :) Heb nu de basis van wat ik wou



Nu kan ik in ieder geval verder aangezien ik nu daar het navigatie_ID kan oppakken (lag aan de spatie er en nou ja al het andere wat ik fout deed)
Fylax is op televisie geweest
  donderdag 8 oktober 2015 @ 13:30:58 #40
118011 BrainOverfloW
Fok! around the Clock!
pi_156688173
In mijn editor, Sublime Text 3, heb ik PHPlint toegevoegd en die werkt op zich prima. Maar is het ook mogelijk om zelf regels toe te voegen?

Ik werk momenteel met JS en PHP door elkaar en na een tijd te hebben zitten debuggen omdat ik over het hoofd zag dat ik '+=' gebruikt had i.p.v. '.=' zou ik daar graag een waarschuwing voor maken als dat mogelijk is.
Whether or not you can become great at something, you can always become better.
And one day you'll wake up and find out how good you actually became, having transcended whatever limits you might have thought you couldn't pass.
Neil Degrasse Tyson
pi_156688279
Lijkt me een beetje raar als je IDE waarschuwingen gaat geven voor dingen die syntactisch gewoon in orde zijn, toch?
  donderdag 8 oktober 2015 @ 13:57:48 #42
118011 BrainOverfloW
Fok! around the Clock!
pi_156688699
quote:
14s.gif Op donderdag 8 oktober 2015 13:35 schreef KomtTijd... het volgende:
Lijkt me een beetje raar als je IDE waarschuwingen gaat geven voor dingen die syntactisch gewoon in orde zijn, toch?
In principe ben ik dat wel met je eens, maar in de afweging tussen dat principe of een melding die me debug tijd bespaard ga ik toch liever voor het tweede. Zeker als ik toch de enige ben die het merkt.
Whether or not you can become great at something, you can always become better.
And one day you'll wake up and find out how good you actually became, having transcended whatever limits you might have thought you couldn't pass.
Neil Degrasse Tyson
pi_156689022
Ik ken Sublime Text niet, dus kan je helaas niet verder helpen. Maar ik ben bang dat je binnen de kortste keren zou verzuipen in de waarschuwingen als je hieraan begint.
  donderdag 8 oktober 2015 @ 14:51:24 #44
118011 BrainOverfloW
Fok! around the Clock!
pi_156689695
quote:
14s.gif Op donderdag 8 oktober 2015 14:12 schreef KomtTijd... het volgende:
Ik ken Sublime Text niet, dus kan je helaas niet verder helpen. Maar ik ben bang dat je binnen de kortste keren zou verzuipen in de waarschuwingen als je hieraan begint.
Zoveel gevallen van code die zowel in JS als PHP syntactisch overeen komen maar in hun werking verschillen kan ik me anders niet bedenken. Ik kom ze in ieder geval nauwelijks tegen.
Als ik per ongeluk een JS functie in mijn PHP gebruik (of anders om) dan krijg ik vanzelf foutmeldingen dus daar ga ik zeker geen lijst van waarschuwingen voor schrijven. Het gaat me puur om de onhandigheid van het verschil tussen die '.=' en '+='.
Whether or not you can become great at something, you can always become better.
And one day you'll wake up and find out how good you actually became, having transcended whatever limits you might have thought you couldn't pass.
Neil Degrasse Tyson
pi_156702767
quote:
14s.gif Op donderdag 8 oktober 2015 13:35 schreef KomtTijd... het volgende:
Lijkt me een beetje raar als je IDE waarschuwingen gaat geven voor dingen die syntactisch gewoon in orde zijn, toch?
PhpStorm kan ook een waarschuwing geven als je iets als
1
2
3
<?php
$b 
+= $a;
?>
probeert, op basis van het type van $a. Als dat een string is, ook een numerieke string, krijg je een warning. Waarschijnlijk gaat het verder dan alleen strings, maar dat heb ik niet gecontroleerd.

Of Sublime het kan, weet ik niet. Ik gebruik Sublime niet.
pi_156707199
quote:
14s.gif Op donderdag 8 oktober 2015 13:35 schreef KomtTijd... het volgende:
Lijkt me een beetje raar als je IDE waarschuwingen gaat geven voor dingen die syntactisch gewoon in orde zijn, toch?
Valt wel mee. Ellende met addition vs concatenation hou je altijd in dit soort weakly typed languages. Vaak is er in IDEs een vorm van type inference aanwezig, die probeert te bepalen wat het type van je variabelen is.
De addition operator blind gebruiken op twee Strings is in een taal als PHP niet bepaald aan te raden. Ook het gebruiken van de concatenation operator op numerieke waarden is niet echt logisch.
Dan is het niet vreemd dat een IDE waarschuwingen geeft als je addition op twee string waarden of concatenation op twee numerieke waarden doet.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_156707794
Oh ik zie nu dat ik verkeerd gelezen had, dacht dat het een waarschuwing op "+=" in plaats van "=" zou zijn. Concatenation vs addition zou idd wel een prettige warning wezen misschien.
  vrijdag 9 oktober 2015 @ 11:53:16 #48
10526 broer
Nutteloze van de nacht.
pi_156708124
Ik krijg het PHPMailer-script niet goed aan de praat. Zou iemand willen meekijken wat ik verkeerd doe?

Mijn bezoekers doorlopen een paar pagina's. Eerst vullen ze een naam en mailadres is, dan krijgen ze een instructie en vervolgens doen ze een test van een aantal meerkeuzevragen.

Als ze daarmee klaar zijn gaan ze naar done.php; daar krijgen ze de uitslag en de mogelijkheid om 1. die uitslag toegemaild te krijgen, of 2. die uitslag toegemaild te krijgen en de resultaten in mijn database te laten zetten:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
<?php
    session_start();
    require "Classes/Test.class.php" ;
    require "Classes/Item.class.php" ;
    require "Classes/Result.class.php" ;
    require "Classes/DB.class.php" ;

?>

<html>
<head>

<?php
include "Includes/header.php" ;
?>

    
</head>

<body onload="$('#submitdone').attr('disabled', 'disabled');">
<div class='takethetest'>
<center>
<div id="result">
<?php
    $test = unserialize($_SESSION['test']) ;
    echo "Score " . $test->extractResults() . " %" ;
    $_SESSION['score'] = $test->extractResults() ;
?>
</div>
</center>
<p>We will send the results
    <?php echo (($_SESSION['sname']!='') ? ' of participant ' . $_SESSION['sname'] . ' ' : '') ; ?>
    to these addresses. Add more addresses if you please, and press the 'Send' button. 'Save and send' will also save the results to our database.</p>

    <form id="emailform" action="index.php" method="post">
    <p><input type="text" value="<?php  if($_SESSION['email0']!=""){echo $_SESSION['email0'] ;}?>"id="email1" name="email1"><br />
    <input type="text" value="<?php  if($_SESSION['email1']!=""){echo $_SESSION['email1'] ;}?>"id="email2" name="email2"><br />
    <input type="text" value="<?php  if($_SESSION['email2']!=""){echo $_SESSION['email2'] ;}?>"id="email3" name="email3"><br />
    <input type="text" value="<?php  if($_SESSION['email3']!=""){echo $_SESSION['email3'] ;}?>"id="email0" name="email0"><br />
    <input type="text" value="" id="email4" name="email4"></p>
            <center><div id="radio">
                  <input type="submit" value="Save and send" id="submitb" name="submitb" />
                  <input type="submit" value="Send" id="submitb" name="submitb" />
          </div>
          </center>

  </form>

    
</div>
</body>

</html>

Vervolgens zou index.php een mooi bedankje moeten laten zien, terwijl hij de mail verstuurt en eventueel de boel opslaat in de database.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
<?php
    session_start() ;
    require "Classes/Test.class.php" ;
    require "Classes/Item.class.php" ;
    require "Classes/Result.class.php" ;
    require "Classes/DB.class.php"

?>
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
<head>
<?php
    include 'Includes/header.php';
    if($_POST['submitb'] != "Send")
        {
            $test = unserialize($_SESSION['test']) ;
            $name = $_SESSION['sname'] ;
            $db = new DB() ;
            $db->connect() ;
            $db->selectDb() ;
            $db->insert($test, $name) ;
        }
    if(isset($_POST['submitb']) && ($_POST['email0']!="" || $_POST['email1']!='' || $_POST['email2']!='' || $_POST['email3']!='' || $_POST['email4']!=''))
    {
        $_SESSION['email0'] = $_POST['email0'] ;
        $_SESSION['email1'] = $_POST['email1'] ;
        $_SESSION['email2'] = $_POST['email2'] ;
        $_SESSION['email3'] = $_POST['email3'] ;
        $_SESSION['email4'] = $_POST['email4'] ;
    
    }

require_once 'PHPMailer/PHPMailerAutoload.php';
$mail = new PHPMailer(true);
$mail->CharSet = 'utf-8';
ini_set('default_charset', 'UTF-8');
 
class phpmailerAppException extends phpmailerException {}

$mail->isSMTP();
$mail->SMTPDebug  = 2;
$mail->Host       = "mail.server.com";
$mail->Port       = "587";
$mail->SMTPSecure = "none";
$mail->SMTPAuth   = true;
$mail->Username   = “mail@server.com";
$mail->Password   = “kloppend wachtwoord”;
$mail->addReplyTo("mail@server.com", “Afzender”);
$mail->setFrom(“mail@server.com”, “Afzender”);
$mail->addAddress(“mail@server.com”, “Ontvanger”);
        if($_SESSION['email0']!="")
            $mail->AddAddress($_SESSION['email0']);
        if($_SESSION['email1']!="")
            $mail->AddAddress($_SESSION['email1']);
        if($_SESSION['email2']!="")
            $mail->AddAddress($_SESSION['email2']);
        if($_SESSION['email3']!="")
            $mail->AddAddress($_SESSION['email3']);
        if($_SESSION['email4']!="")
            $mail->AddAddress($_SESSION['email4']);
$mail->Subject  = “Results";
        $message = 'Dear participant,’ . "\n\n" . 'On ' . date("F j, Y, g:i a") . ',' . (isset($_SESSION['sname']) ? ' ' . $_SESSION['sname'] : ' [anonymous]') . ' participated in the ' . ucfirst($_SESSION['language']) . ' version of our test. The score was ' . $_SESSION['score'] . ' %.';

        $message .= "\n\n" . 'Thank you for participating!' ;

        
$body = $message;
$mail->WordWrap = 78;
$mail->msgHTML($body, dirname(__FILE__), true); 

    session_destroy() ;
?>

    </head>

<body>
<div class='takethetest'>
<h1>Thank you</h1>
 
        
        <p>Thank you very much for taking the test.</p>
        <p><a href="#" class="button1" id="close" onclick="$('.popupBG',parent.document).trigger('click');">
            Close window</a></p>
        <p><a href="../index.html" class="button1" id="home">
            Back to the homepage</a></p>
    </div>
    
    

    
    </body>

</html>

Maar index.php geeft niets weer. Alleen een blank scherm. Er wordt ook geen mail verstuurd.

Op de PHPMailer-testpagina heb ik de smtp-server getest, en daarmee komt de mail wel binnen. Daar lijkt me dus niets mis mee.

Maar wat dan wel? Wat zie ik over het hoofd? :( (Ik ben een volslagen php-dummie, trouwens. Dus ik ga ervan uit dat het iets heel stoms is.)

Alvast veel dank voor de mensen die meelezen. :)
pi_156708656
Ga eerst je debug meldingen maar eens aanzetten.
  vrijdag 9 oktober 2015 @ 14:01:36 #50
10526 broer
Nutteloze van de nacht.
pi_156710157
Helaas weet ik niet precies wat je daarmee bedoelt. Sorry.

Als ik in mijn browser de foutmeldingen aanzet, krijg ik bij de overgang tussen de twee pagina's een '500: internal server error'. Als ik het mail-deel uit de tweede pagina haal, krijg ik die foutmelding niet.
pi_156716369
quote:
7s.gif Op vrijdag 9 oktober 2015 14:01 schreef broer het volgende:
Helaas weet ik niet precies wat je daarmee bedoelt. Sorry.

Als ik in mijn browser de foutmeldingen aanzet, krijg ik bij de overgang tussen de twee pagina's een '500: internal server error'. Als ik het mail-deel uit de tweede pagina haal, krijg ik die foutmelding niet.
http://php.net/manual/en/function.error-reporting.php
http://php.net/manual/en/(...)p#ini.display-errors
pi_156718275
Ik heb geprobeerd mij in te lezen over PHP unit tests, maar na aantal tutorials verder, begrijp ik nog steeds de apeballen van.

Iemand die mij kan bijpraten?
pi_156718543
quote:
0s.gif Op vrijdag 9 oktober 2015 21:17 schreef Robuustheid het volgende:
Ik heb geprobeerd mij in te lezen over PHP unit tests, maar na aantal tutorials verder, begrijp ik nog steeds de apeballen van.

Iemand die mij kan bijpraten?
Unit testen is gewoon een algemeen concept in software development. Wat je er mee doet is 'eenheden' testen. In het geval van een taal als PHP zijn dat vaak functies / methodes. Je doet dan tests waarbij je de functie aanroept met bepaalde parameters en kijkt of de waarde die je terug krijgt ook daadwerkelijk de verwachte uitkomst is.
Vaak doe je per functie een paar van zulke input / output checks om alle codepaden en randgevallen te verifiëren.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  vrijdag 9 oktober 2015 @ 21:53:00 #54
10526 broer
Nutteloze van de nacht.
pi_156719518
quote:
Dank je wel! :)

Ik ben er inmiddels uit, trouwens. Het ging om een haakje of een accolade of iets anders stoms.
pi_156723700
quote:
7s.gif Op vrijdag 9 oktober 2015 21:53 schreef broer het volgende:

[..]

Dank je wel! :)

Ik ben er inmiddels uit, trouwens. Het ging om een haakje of een accolade of iets anders stoms.
Dat is het meestal. Maar als je je error-reporting uit hebt staan is het zoeken naar een speld in een hooiberg.
pi_156726839
quote:
14s.gif Op zaterdag 10 oktober 2015 00:11 schreef KomtTijd... het volgende:

[..]

Dat is het meestal. Maar als je je error-reporting uit hebt staan is het zoeken naar een speld in een hooiberg.
Een goede IDE kan het leven dan wel makkelijker maken. Maar als je daarop moet vertrouwen en anders niets kunt, klopt er ook iets niet. :)
  zondag 18 oktober 2015 @ 19:06:19 #57
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_156926556
Momenteel ben ik een beetje aan het kloten met een thuisserver, maar het lukt niet helemaal. De situatie is als volgt:

Ik heb een lamp-stack geïnstalleerd en de apache root-folder veranderd naar /media/server (een gemounte schijf). Nu wil ik een webpagina magen die alle mappen in /media/HardeSchijf/film (op een andere gemounte schijf dus) oplijst met een link om het filmbestand in die map te openen.

Voor het oplijsten van die mappen heb ik al een manier gevonden, maar ik krijg de link in het filmbestand niet correct. De code die ik momenteel heb, is:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
$dir = "../../media/HardeSchijf/Film";
    $filelist = [ ];
    $n=0;

if (is_dir($dir)) {
    if ($dh = opendir($dir)) {
        while (($file = readdir($dh)) !== false) {
          if($file !== "." and $file !== ".." and $file !== "desktop.ini"
             and $file !== "index.php" and $file !== "lost+found") {
            $filelist[$n] = "$file";
            $n += 1;
        }
        }
        closedir($dh);
    }
}
sort($filelist);
foreach($filelist as $value) {
  echo "<a href='" . $dir. "/" . $value . "/" . $value . ".avi'>" . $value . "</a></br>";
}
Alles daarmee gaat goed; hij echo't een perfecte lijst van mappen, telkens met de naam van de map als link. Maar die link werkt in geen enkel geval, als ik daarop klik krijg ik een 404. Wat doe ik hier verkeerd?

Trouwens, de .avi-uitgang is omdat de bestanden allemaal een andere uitgang hebben (avi, mkv, mp4, etc) en ik telkens met dezelfde map test. Daarop moet ik nog een betere oplossing vinden.
  zondag 18 oktober 2015 @ 19:34:41 #58
91039 mstx
2x1/2 = 1/2 x 1/2
pi_156927290
Je kan nooit linken naar bestanden buiten de webroot. Je zou een symbolic link binnen de webroot kunnen maken die naar die map verwijst.
Op donderdag 2 juli 2009 22:41 schreef RTB het volgende:
als ik elk rap"liedje" een kans moest geven was ik aan het eind van dit millennium nog bezig met het tempo waarin die kotshoop uitgebraakt wordt.
👾
  zondag 18 oktober 2015 @ 19:53:47 #59
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_156927755
quote:
0s.gif Op zondag 18 oktober 2015 19:34 schreef mstx het volgende:
Je kan nooit linken naar bestanden buiten de webroot. Je zou een symbolic link binnen de webroot kunnen maken die naar die map verwijst.
Maar ik kan ze dus wel oplijsten? -edit: oh, het kan dus wel oplijsten omdat dit server-side gebeurt met PHP, maar niet linken omdat dat browser-side gebeurt.

Anyhow, kan ik dat op zo'n manier doen dat de variabelen bruikbaar blijven? Bijv:
Symlink maken: ./film naar /media/Hardeschijf/Film
In php: echo "<a href='"./film/" . $value . "/" . $value . ".avi'>" . $value . "</a></br>"

Die methode werkt al niet, heb ik gemerkt. Maar misschien op een andere manier?

[ Bericht 6% gewijzigd door Ser_Ciappelletto op 18-10-2015 20:05:05 ]
pi_156952217
quote:
0s.gif Op zondag 18 oktober 2015 19:53 schreef Ser_Ciappelletto het volgende:

[..]

Maar ik kan ze dus wel oplijsten? -edit: oh, het kan dus wel oplijsten omdat dit server-side gebeurt met PHP, maar niet linken omdat dat browser-side gebeurt.

Anyhow, kan ik dat op zo'n manier doen dat de variabelen bruikbaar blijven? Bijv:
Symlink maken: ./film naar /media/Hardeschijf/Film
In php: echo "<a href='"./film/" . $value . "/" . $value . ".avi'>" . $value . "</a></br>"

Die methode werkt al niet, heb ik gemerkt. Maar misschien op een andere manier?
http://php.net/manual/en/function.readfile.php
Let wel goed op je beveiliging, zeker als de webserver vanaf buiten bereikbaar is,
  maandag 19 oktober 2015 @ 20:01:59 #61
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_156952655
quote:
0s.gif Op maandag 19 oktober 2015 19:48 schreef Darkomen het volgende:

[..]

http://php.net/manual/en/function.readfile.php
Let wel goed op je beveiliging, zeker als de webserver vanaf buiten bereikbaar is,
Het is een lokale mediaserver, dus dat is geen probleem.

Ik heb het overigens opgelost door de harde schijf te mounten in de webroot. Dat is minder geklooi.
pi_156952797
quote:
0s.gif Op maandag 19 oktober 2015 20:01 schreef Ser_Ciappelletto het volgende:

[..]

Het is een lokale mediaserver, dus dat is geen probleem.

Ik heb het overigens opgelost door de harde schijf te mounten in de webroot. Dat is minder geklooi.
Weet je héél zeker dat alles lokaal is en altijd lokaal zal blijven?

Dit klinkt namelijk echt als een disaster waiting to happen...
  maandag 19 oktober 2015 @ 20:10:05 #63
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_156952861
quote:
11s.gif Op maandag 19 oktober 2015 20:07 schreef KomtTijd... het volgende:

[..]

Weet je héél zeker dat alles lokaal is en altijd lokaal zal blijven?

Dit klinkt namelijk echt als een disaster waiting to happen...
Waarom zou dat niet zo zijn? Dan zou ik eerst mijn router zo moeten configureren dat 'ie naar die server verwijst en zo, en dat heb ik nooit gedaan en ben ik ook niet van plan.
pi_156953101
Maar als je over een jaar toch een poortje open zet omdat je iets extern wilt testen of zo, is dus je complete systeem world readable...
  maandag 19 oktober 2015 @ 20:22:28 #65
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_156953224
quote:
14s.gif Op maandag 19 oktober 2015 20:18 schreef KomtTijd... het volgende:
Maar als je over een jaar toch een poortje open zet omdat je iets extern wilt testen of zo, is dus je complete systeem world readable...
De kans is groter dat ik over twee weken het hele systeem opnieuw moet installeren omdat het allemaal kapot is. :P

Overigens zou dat een kwestie zijn van de schijf unmounten zolang ik het poortje open heb staan.
  zaterdag 24 oktober 2015 @ 22:03:10 #66
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157071737
Volgende vraagje: als ik met PHP een MySQL tabel opvraag en wegschrijf, krijg ik maar een deel van de tabel.

De code:
1
2
3
4
5
6
7
8
9
10
11
   $vraagact= "SELECT * FROM " . $q;
   $output = $conn->query($vraagact);
   echo "<table><thead>Actief</thead>";
   if ($output->num_rows > 0) {
      while($row = $output->fetch_assoc()) {
        echo "<tr><td>" . $row["Tijd"] . "</td><td>" . $row["Indiciatief"] . "</td><td>" . $row["Conjunctief"]."</td><td>" . $row["Imperatief"]."</td><td>" . $row["Infinitief"]. "</td><td>" . $row["Participium"]."</td></tr>";
      }
   } else {
       echo "0 results";
     }
     echo "</table>";
Het resultaat:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Bij "Futurum" en "Fut. Exactum" zouden nog zes woorden moeten staan, die er niet staan. In MySQL staat het correct. Het veranderen van 'Fut' in iets anders heeft geen zin. Ik heb echt geen idee waar dit verder aan kan liggen.

Er zijn trouwens vijf tabellen met ongeveer dezelfde inhoud, die hetzelfde gedrag vertonen: telkens valt de eerste kolom weg bij 'futurum' en 'fut. exactum'.
pi_157082102
quote:
0s.gif Op zaterdag 24 oktober 2015 22:03 schreef Ser_Ciappelletto het volgende:
Volgende vraagje: als ik met PHP een MySQL tabel opvraag en wegschrijf, krijg ik maar een deel van de tabel.

De code:
[ code verwijderd ]

Het resultaat:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Bij "Futurum" en "Fut. Exactum" zouden nog zes woorden moeten staan, die er niet staan. In MySQL staat het correct. Het veranderen van 'Fut' in iets anders heeft geen zin. Ik heb echt geen idee waar dit verder aan kan liggen.

Er zijn trouwens vijf tabellen met ongeveer dezelfde inhoud, die hetzelfde gedrag vertonen: telkens valt de eerste kolom weg bij 'futurum' en 'fut. exactum'.
"Correct" in MySQL is wel een vage term. Wat staat er precies?
  zondag 25 oktober 2015 @ 12:57:07 #68
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157082333
quote:
0s.gif Op zondag 25 oktober 2015 12:47 schreef Light het volgende:

[..]

"Correct" in MySQL is wel een vage term. Wat staat er precies?
De tabel zoals hij hoort, met de twaalf entries die op de site wegvallen.

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
pi_157082398
En een screenshot van een render van de output van je script is ook nogal vaag, dump dan gewoon het resultaat van je query.
  zondag 25 oktober 2015 @ 13:02:15 #70
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157082475
quote:
14s.gif Op zondag 25 oktober 2015 12:59 schreef KomtTijd... het volgende:
En een screenshot van een render van de output van je script is ook nogal vaag, dump dan gewoon het resultaat van je query.
Ik kreeg dat niet gekopieerd vanuit Putty. :')
pi_157082580
quote:
14s.gif Op zondag 25 oktober 2015 12:59 schreef KomtTijd... het volgende:
En een screenshot van een render van de output van je script is ook nogal vaag, dump dan gewoon het resultaat van je query.
Ik zie hier in ieder geval geen html-zooi in. Bij iets dat door een browser niet goed gerenderd wordt, is dat een van de eerste dingen waar ik aan denk.
pi_157082683
quote:
0s.gif Op zaterdag 24 oktober 2015 22:03 schreef Ser_Ciappelletto het volgende:
Volgende vraagje: als ik met PHP een MySQL tabel opvraag en wegschrijf, krijg ik maar een deel van de tabel.

De code:
[ code verwijderd ]

Het resultaat:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Bij "Futurum" en "Fut. Exactum" zouden nog zes woorden moeten staan, die er niet staan. In MySQL staat het correct. Het veranderen van 'Fut' in iets anders heeft geen zin. Ik heb echt geen idee waar dit verder aan kan liggen.

Er zijn trouwens vijf tabellen met ongeveer dezelfde inhoud, die hetzelfde gedrag vertonen: telkens valt de eerste kolom weg bij 'futurum' en 'fut. exactum'.
In je code gebruik je
1
2
3
<?php
$row
["Indiciatief"]
?>
maar de kolom heet "Indicatief". Je probeert dus een niet-bestaande kolom uit te lezen.
pi_157082727
In de uitvoer is alleen de kolom conjunctief te zien, en die is leeg voor de futurum-vormen.
  zondag 25 oktober 2015 @ 13:15:04 #74
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157082738
quote:
0s.gif Op zondag 25 oktober 2015 13:11 schreef Light het volgende:

[..]

In je code gebruik je
[ code verwijderd ]

maar de kolom heet "Indicatief". Je probeert dus een niet-bestaande kolom uit te lezen.
Ah verrek, je hebt helemaal gelijk. Kut, wat een blunder.

Bedankt voor de hulp alleszins!
pi_157082911
E_NOTICE blijkt dus toch weer verrot handig te zijn.
  dinsdag 27 oktober 2015 @ 13:51:21 #76
37634 wobbel
Da WoBBeL King
pi_157133913
Ik heb weer 'n kut vraag...hoe doe ik een join maar dan omgekeerd :P

Tabel 1: Klanten met een klant ID

Tabel 2: Bestellingen gekoppeld aan klant ID

Ik wil nu alle klanten krijgen die géén bestelling hebben. Doe ik dit ook gewoon met een JOIN ofzo? Want die moet ik altijd koppelen op de ID's en dat wil ik nu juist niet -O-
pi_157134356
quote:
0s.gif Op dinsdag 27 oktober 2015 13:51 schreef wobbel het volgende:
Ik heb weer 'n kut vraag...hoe doe ik een join maar dan omgekeerd :P

Tabel 1: Klanten met een klant ID

Tabel 2: Bestellingen gekoppeld aan klant ID

Ik wil nu alle klanten krijgen die géén bestelling hebben. Doe ik dit ook gewoon met een JOIN ofzo? Want die moet ik altijd koppelen op de ID's en dat wil ik nu juist niet -O-
Je kunt een LEFT JOIN gebruiken.
Voor rijen die niet gekoppeld konden worden krijg je NULL terug waarop je kunt filteren.
Be curious, not judgmental
pi_157134454
quote:
0s.gif Op dinsdag 27 oktober 2015 13:51 schreef wobbel het volgende:
Ik heb weer 'n kut vraag...hoe doe ik een join maar dan omgekeerd :P

Tabel 1: Klanten met een klant ID

Tabel 2: Bestellingen gekoppeld aan klant ID

Ik wil nu alle klanten krijgen die géén bestelling hebben. Doe ik dit ook gewoon met een JOIN ofzo? Want die moet ik altijd koppelen op de ID's en dat wil ik nu juist niet -O-
Jawel, je wilt wel joinen op id's, maar daarna wil je alle regels waar die join resultaten oplevert er weer uit filteren.
Zoals Aether hierboven ook zegt:

1
2
3
4
SELECT klant.*
FROM klant
    LEFT JOIN bestelling ON klant.id = bestelling.klant_id
WHERE bestelling.id IS NULL;
pi_157134834
quote:
7s.gif Op dinsdag 27 oktober 2015 14:12 schreef Aether het volgende:

[..]

Je kunt een LEFT JOIN gebruiken.
Voor rijen die niet gekoppeld konden worden krijg je NULL terug waarop je kunt filteren.
Je kan dan beter WHERE NOT EXISTS() gebruiken.

SELECT K.ID
FROM Klanten AS K
WHERE NOT EXISTS ( SELECT 1 FROM Bestellingen AS B WHERE B.KlantID=K.ID )
  woensdag 28 oktober 2015 @ 16:50:38 #80
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157161864
Ik heb een pagina buiten de webroot staan waarin een form action voorkomt die verwijst naar een php-scriptje dat ook buiten de webroot staat.

De situatie is als volgt:
- Webroot
- Anderefolder -> (pagina.php met <form action=script.php>), script.php.

Pagina.php zet ik liever niet in de webroot. Kan ik een verwijzing maken vanuit die andere map?
pi_157164929
quote:
19s.gif Op dinsdag 27 oktober 2015 14:37 schreef TwenteFC het volgende:

[..]

Je kan dan beter WHERE NOT EXISTS() gebruiken.

SELECT K.ID
FROM Klanten AS K
WHERE NOT EXISTS ( SELECT 1 FROM Bestellingen AS B WHERE B.KlantID=K.ID )
Dan heb je een dependant subquery en waarschijnlijk minder optimalisatiemogelijkheden. Bij kleine aantallen (tientallen) maakt dat niet uit, bij grotere aantallen klanten en/of bestellingen zou ik het eerst vergelijken om te zien welke oplossing beter presteert.
pi_157167064
quote:
0s.gif Op woensdag 28 oktober 2015 16:50 schreef Ser_Ciappelletto het volgende:
Pagina.php zet ik liever niet in de webroot. Kan ik een verwijzing maken vanuit die andere map?
Waarom? Als je een rare oplossing moet zoeken, dan betekend het meestal dat je iets fout doet.
pi_157176826
Ik weet dat PHP kan checken met wat voor soort bowser je de site bekijkt. Zou je er dan voor kunnen zorgen dat je een andere pagina indeling voor je mobiel krijgt dan 'gewoon' achter de computer?
  donderdag 29 oktober 2015 @ 08:06:34 #84
37634 wobbel
Da WoBBeL King
pi_157177063
quote:
0s.gif Op woensdag 28 oktober 2015 19:17 schreef Light het volgende:

[..]

Dan heb je een dependant subquery en waarschijnlijk minder optimalisatiemogelijkheden. Bij kleine aantallen (tientallen) maakt dat niet uit, bij grotere aantallen klanten en/of bestellingen zou ik het eerst vergelijken om te zien welke oplossing beter presteert.
Het gaat om een paar duizend records, dus op zich valt het mee. Maar bedankt voor het meedenken, zoeken met NULL functioneert inderdaad :) Weer wat geleerd vandaag.

Gaan we ons vandaag eens inlezen in DOMDocument...moet een 12e span uitlezen uit een HTML document _O-
pi_157187823
quote:
0s.gif Op donderdag 29 oktober 2015 08:06 schreef wobbel het volgende:

[..]

Het gaat om een paar duizend records, dus op zich valt het mee. Maar bedankt voor het meedenken, zoeken met NULL functioneert inderdaad :) Weer wat geleerd vandaag.

Gaan we ons vandaag eens inlezen in DOMDocument...moet een 12e span uitlezen uit een HTML document _O-
Kun je die span niet op iets anders pakken dan dat het het 12e item is? Iets met een id, class of ander attribuut zou het leven veel makkelijker maken, dan ben je niet meer volledig afhankelijk van de volgorde waarin de items staan.
  donderdag 29 oktober 2015 @ 19:54:36 #86
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157188833
quote:
0s.gif Op woensdag 28 oktober 2015 20:25 schreef Darkomen het volgende:

[..]

Waarom? Als je een rare oplossing moet zoeken, dan betekend het meestal dat je iets fout doet.
Geen idee of het een rare oplossing is en of ik iets fout doe. :P
  FOK!mycroftheld zaterdag 31 oktober 2015 @ 19:56:35 #87
128465 verified  bondage
pi_157229352
Ik heb het in het verleden al een keer eerder gevraagd maar helaas is het tot dusver nog niet gelukt, probeer het daarom nog maar een keer :7

Wat ik wil is in een sql query quotes uit reacties filteren. Ik heb hiervoor iets geschreven maar dit werkt helaas niet naar wens. Het probleem is dat alleen de eerste quote eruit wordt gefilterd en de rest wordt genegeerd.

Iemand een idee of het überhaupt mogelijk is in sql en wat mijn opties zijn? Mijn idee zou zijn om er een loop van te maken en net zo vaak itereren dat het hele bericht doorlopen is. Ik kan echter geen bruikbare voorbeelden vinden.

Dit is de query die ik nu gebruik:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
             SELECT ...
                    CASE WHEN LOCATE( '<blockquote>', `contents` ) != 0 THEN 
                            MID( 
                               `contents`, 
                               LOCATE( '<blockquote>', `contents` ) + 12, 
                               (LOCATE( '</blockquote>', `contents` ) - LOCATE( '<blockquote>', `contents` )) - 12 
                            ) 
                    ELSE 
                            '' 
                    END AS post_quote, 
                    CASE WHEN LOCATE( '<blockquote>', `contents` ) != 0 THEN 
                            CONCAT_WS( 
                               LEFT( `contents` , LOCATE( '<blockquote>', `contents`) - 1), ' ', 
                               RIGHT( `contents` , LENGTH(`contents`) - (LOCATE( '</blockquote>', `contents` ) + 12)) 
                            ) 
                    ELSE 
                            `contents` 
                    END AS post_contents, 
                    ...
            FROM fok_topic, fok_post 
            WHERE ...

Hier komen twee velden uit, namelijk: post_quote en post_contents. Het eerste veld moet alle quotes bevatten en het tweede de overige tekst.

Hieronder een voorbeeld van de data welke doorzocht wordt:
1
2
3
4
5
6
<blockquote><font size="1" face="verdana, aial, helvetica">quote:</font>
<hr>Feedback is geen vrijblijvend "post hier wat je wilt"-forum. Als je denkt grappig te 
moeten zijn, je postaantal te moeten opkrikken of om een andere reden een post plaatst die in de 
FB-context totaal geen nut heeft, loop je de kans dat je post verwijderd wordt.<hr>
</blockquote>Nog steeds geldt in Feedback het "post dan niks"-principe: als je niks te 
melden hebt, ga dan wat anders doen. Er moeten nog te veel compleet nutteloze posts verwijderd worden...

Edit: Deze data wordt aan een Sphinx zoekserver index gevoed en ik kan helaas niets manipuleren. Dit is de reden dat het in de query moet worden gedaan.

[ Bericht 0% gewijzigd door bondage op 31-10-2015 20:11:42 ]
pi_157229541
Volgens mij heeft MySQL nog steeds niet echt lekkere support voor regular expressions, maar dit is een schoolvoorbeeld van een situatie waarbij je die wilt gebruiken. ;)
Is het geen optie om gewoon het geheel te selecteren en de regex replace in PHP te doen?
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  FOK!mycroftheld zaterdag 31 oktober 2015 @ 20:06:24 #89
128465 verified  bondage
pi_157229638
quote:
0s.gif Op zaterdag 31 oktober 2015 20:03 schreef Monolith het volgende:
Volgens mij heeft MySQL nog steeds niet echt lekkere support voor regular expressions, maar dit is een schoolvoorbeeld van een situatie waarbij je die wilt gebruiken. ;)
Is het geen optie om gewoon het geheel te selecteren en de regex replace in PHP te doen?
Jup, klopt :) Ik was vergeten te vermelden dat het niet naar een PHP script gaat. Deze data wordt aan een Sphinx zoekserver index gevoed en ik kan helaas niets manipuleren. Dit moet dus in de query worden gedaan.
pi_157229772
quote:
14s.gif Op zaterdag 31 oktober 2015 20:06 schreef bondage het volgende:

[..]

Jup, klopt :) Ik was vergeten te vermelden dat het niet naar een PHP script gaat. Deze data wordt aan een Sphinx zoekserver index gevoed en ik kan helaas niets manipuleren. Dit moet dus in de query worden gedaan.
Sphinx ken ik niet echt als search engine, maar heeft die niet net als bijvoorbeeld ElastisSearch en SOLR gewoon filtermogelijkheden op de gevoede data?
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  FOK!mycroftheld zaterdag 31 oktober 2015 @ 20:17:45 #91
128465 verified  bondage
pi_157229925
quote:
1s.gif Op zaterdag 31 oktober 2015 20:11 schreef Monolith het volgende:

[..]

Sphinx ken ik niet echt als search engine, maar heeft die niet net als bijvoorbeeld ElastisSearch en SOLR gewoon filtermogelijkheden op de gevoede data?
Het is bij Sphinx mogelijk om gebruik te maken van een xml pipe. Dan kan ik de data zelf aan de indexer voeden vanuit een php script. Dit is echter zeer traag en daarom geen optie. Helaas is het maar een simpele server en als er heel veel tegelijk uitgevoerd moet worden vertraagt de boel.
pi_157230201
quote:
14s.gif Op zaterdag 31 oktober 2015 20:17 schreef bondage het volgende:

[..]

Het is bij Sphinx mogelijk om gebruik te maken van een xml pipe. Dan kan ik de data zelf aan de indexer voeden vanuit een php script. Dit is echter zeer traag en daarom geen optie. Helaas is het maar een simpele server en als er heel veel tegelijk uitgevoerd moet worden vertraagt de boel.
Is zoiets geen optie?
https://github.com/hholzgra/mysql-udf-regexp

Als je tenminste UDFs kunt gebruiken op je server.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  FOK!mycroftheld zaterdag 31 oktober 2015 @ 20:30:38 #93
128465 verified  bondage
pi_157230295
quote:
1s.gif Op zaterdag 31 oktober 2015 20:27 schreef Monolith het volgende:

[..]

Is zoiets geen optie?
https://github.com/hholzgra/mysql-udf-regexp

Als je tenminste UDFs kunt gebruiken op je server.
Dank, ga ik even checken. Het is mijn eigen server, denk dat ik die mogelijkheid wel heb. En anders creëer ik deze (8>

Heb echter nog niet eerder iets met UDFs gedaan dus even uitzoeken hoe en wat.
pi_157277098
Ik heb een bestan met op elke lijn 2 of meerdere bestandsnamen. Deze zijn gescheiden door een spatie en spaties in bestandsnamens geescaped. (Voor de nieuwsgierigen, output van fdupes -1 -r -S ./)

Ik wil deze lijnen met preg_split splitten, maar ik breek m'n hersens over hoe ik met die escaped spatie om moet gaan. Hoe krijg ik dit voor elkaar?

Zelfs $files = str_getcsv($line," ","","\\"); biedt geen uitkomst.. (Waarom herkent ie de backslashes niet?)

[ Bericht 14% gewijzigd door Keiichi op 02-11-2015 21:11:04 ]
pi_157279732
spaties matchen op [^\\]\s ?
pi_157285270
quote:
0s.gif Op maandag 2 november 2015 20:36 schreef Keiichi het volgende:
Ik heb een bestan met op elke lijn 2 of meerdere bestandsnamen. Deze zijn gescheiden door een spatie en spaties in bestandsnamens geescaped. (Voor de nieuwsgierigen, output van fdupes -1 -r -S ./)

Ik wil deze lijnen met preg_split splitten, maar ik breek m'n hersens over hoe ik met die escaped spatie om moet gaan. Hoe krijg ik dit voor elkaar?

Zelfs $files = str_getcsv($line," ","","\\"); biedt geen uitkomst.. (Waarom herkent ie de backslashes niet?)
Zoiets?
1
2
3
4
5
<?php 
$s 
'123.php 456\ 789.php ab\ c\ def.php';
$a preg_split'~(?<!\\\)\\s~'$s ); 
print_r($a); 
?>
1
2
3
4
5
6
Array
(
    [0] => 123.php
    [1] => 456\ 789.php
    [2] => ab\ c\ def.php
)
Be curious, not judgmental
  FOK!mycroftheld zaterdag 7 november 2015 @ 14:14:37 #97
128465 verified  bondage
pi_157380875
Ik zit met een regex probleempje en aangezien ik nogal faal als het aankomt op reguliere expressies kom er niet uit ;(

Wat ik wil is plaatjes uit posts filteren, echter moeten plaatjes met een bepaalde class wel blijven staan.

Dit moet blijven:
1<img class="rde_img_smiley" src="http://i.fok.nl/s/clown.gif" width="15" height="15" alt=":+" />

Dit moet weg:
1<img data-src="http://www.voorbeeld.com/bla.jpg" style="visibility:hidden;" />

Ik gebruik deze regex maar die haalt alle afbeeldingen weg:

1
2
3
<?php
$result 
preg_replace('/<img(?<!class="rde_img_smiley")[^>]+\>/i'"[afbeelding verwijderd]"$post_contents);
?>

Iemand idee hoe dit op te lossen?
pi_157385040
quote:
11s.gif Op zaterdag 7 november 2015 14:14 schreef bondage het volgende:
Ik zit met een regex probleempje en aangezien ik nogal faal als het aankomt op reguliere expressies kom er niet uit ;(

Wat ik wil is plaatjes uit posts filteren, echter moeten plaatjes met een bepaalde class wel blijven staan.

Dit moet blijven:
[ code verwijderd ]

Dit moet weg:
[ code verwijderd ]

Ik gebruik deze regex maar die haalt alle afbeeldingen weg:
[ code verwijderd ]

Iemand idee hoe dit op te lossen?
Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems. (bron / meer info)

Ik zou DOMDocument gebruiken, in combinatie met DOMNode::removeChild() (die je gewoon hebt, want DOMDocument extends DOMNode).
  Moderator / Redactie Sport zaterdag 7 november 2015 @ 18:22:45 #99
359864 crew  Nattekat
De roze zeekat
pi_157385295
Als je al RE's wilt gebruiken, dan hoef je enkel te kijken of de string 'class=*"rde_smiley"' (niet) bevat.

Dus .*(class\=).*(\"rde_smiley\").*
100.000 katjes
Maakte de 100.000e post in BIT
Er eens op uit?
pi_157385441
quote:
0s.gif Op zaterdag 7 november 2015 18:22 schreef Nattekat het volgende:
Als je al RE's wilt gebruiken, dan hoef je enkel te kijken of de string 'class=*"rde_smiley"' (niet) bevat.

Dus .*(class\=).*(\"rde_smiley\").*
En dan moet je er nog rekening mee houden dat die class kan worden voorafgegaan en/of gevolgd door een andere class. En dat een afbeelding zonder die class gevolgd kan worden door een met die class, dan moet je wel de goede afbeelding verwijderen. En over een half jaar moet je ook nog snappen wat de regex doet (ook als het er niet in commentaar bij staat).
  Moderator / Redactie Sport zaterdag 7 november 2015 @ 18:37:45 #101
359864 crew  Nattekat
De roze zeekat
pi_157385533
quote:
0s.gif Op zaterdag 7 november 2015 18:32 schreef Light het volgende:

[..]

En dan moet je er nog rekening mee houden dat die class kan worden voorafgegaan en/of gevolgd door een andere class. En dat een afbeelding zonder die class gevolgd kan worden door een met die class, dan moet je wel de goede afbeelding verwijderen. En over een half jaar moet je ook nog snappen wat de regex doet (ook als het er niet in commentaar bij staat).
Dit is dan per DOM-element (wat sowieso al een aanrader is om te doen), even niet helemaal goed naar de vraag gekeken. In zo'n hele post is het bijna geen doen meer om nog een RE te gebruiken idd.
100.000 katjes
Maakte de 100.000e post in BIT
Er eens op uit?
pi_157385593
In het soort 'niet gevolgd door' scenario's gebruik je in regular expressions doorgaans negative lookahead:
http://regular-expressions.mobi/lookaround.html
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  FOK!mycroftheld zaterdag 7 november 2015 @ 18:46:09 #103
128465 verified  bondage
pi_157385697
quote:
0s.gif Op zaterdag 7 november 2015 18:03 schreef Light het volgende:

[..]

Some people, when confronted with a problem, think
“I know, I'll use regular expressions.” Now they have two problems. (bron / meer info)

Ik zou DOMDocument gebruiken, in combinatie met DOMNode::removeChild() (die je gewoon hebt, want DOMDocument extends DOMNode).
Dank, dat had ik zelf ook wel kunnen bedenken natuurlijk 8)7
pi_157386103
Vraagje, stel je hebt een formulier met gebruikersnaam en wachtwoord.

Beide elementen moeten voldoen aan veel eisen.

Naam ; minimaal 6, maximaal 30 tekens. Geen spaties en bepaalde karakters, Geen herhalingen van letters (3x een e achter elkaar bv). En minimaal 1 hoofdletter.
Wachtwoord: minimaal 6, maximaal 30 tekens. Geen spaties. Minimaal 1 teken, 1 cijfer en 1 hoofdletter.

Hoe ga je om met gevonden fouten als je het formulier controleert??
Just say hi!
pi_157386390
quote:
0s.gif Op zaterdag 7 november 2015 19:08 schreef Chandler het volgende:
Vraagje, stel je hebt een formulier met gebruikersnaam en wachtwoord.

Beide elementen moeten voldoen aan veel eisen.

Naam ; minimaal 6, maximaal 30 tekens. Geen spaties en bepaalde karakters, Geen herhalingen van letters (3x een e achter elkaar bv). En minimaal 1 hoofdletter.
Wachtwoord: minimaal 6, maximaal 30 tekens. Geen spaties. Minimaal 1 teken, 1 cijfer en 1 hoofdletter.

Hoe ga je om met gevonden fouten als je het formulier controleert??
Met zoveel eisen zou ik aan de voorkant met javascript sowieso realtime een "checklist" afvinken terwijl de gebruiker typt.

Wanneer een formulier foutief wordt gepost zou ik deze zelfde checklist natuurlijk weer zo actueel mogelijk bijwerken ondersteund met een lijstje van meldingen waarom de huidige input fout is.

Dit lijkt mij vrij standaard.
pi_157388523
quote:
0s.gif Op zaterdag 7 november 2015 19:08 schreef Chandler het volgende:
Vraagje, stel je hebt een formulier met gebruikersnaam en wachtwoord.

Beide elementen moeten voldoen aan veel eisen.

Naam ; minimaal 6, maximaal 30 tekens. Geen spaties en bepaalde karakters, Geen herhalingen van letters (3x een e achter elkaar bv). En minimaal 1 hoofdletter.
Wachtwoord: minimaal 6, maximaal 30 tekens. Geen spaties. Minimaal 1 teken, 1 cijfer en 1 hoofdletter.
Waarom maximaal 30 tekens en geen spaties voor een wachtwoord? Als het goed is, sla je ze toch goed gehashed op en dan maken spaties en het aantal tekens niet zo heel veel uit.
pi_157391948
quote:
11s.gif Op zaterdag 7 november 2015 18:46 schreef bondage het volgende:

[..]

Dank, dat had ik zelf ook wel kunnen bedenken natuurlijk 8)7
Ik heb ondertussen ook even geprobeerd dit op te lossen en er zijn een paar punten waar je rekening mee moet houden. Dit is mijn oplossing:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
<?php
class FokDemo
{
    
/** @var DOMDocument */
    
private $document;

    
/**
     * FokDemo constructor.
     */
    
public function __construct()
    {
        
$this->document = new DOMDocument();
        
$this->document->preserveWhiteSpace true;
    }

    
/**
     * @param string $content
     */
    
public function setContent($content)
    {
        @
$this->document->loadHTML($content);
    }

    
/**
     * @return string
     */
    
public function getContent()
    {
        return 
$this->document->saveHTML();
    }

    
/**
     * @param string $tagName
     * @param array $exceptWithClass
     *
     * @return int The number of removed items
     */
    
public function removeElements($tagName, array $exceptWithClass = array())
    {
        
$removed 0;

        
$doc $this->document;

        
// This list is dynamic. Any change in the document will immediately be reflected here
        
$nodes $doc->getElementsByTagName($tagName);

        for (
$nodeIndex $nodes->length 1$nodeIndex >= 0$nodeIndex--) {
            
$node $nodes->item($nodeIndex);
            if (
$this->shouldNodeBeRemoved($node$exceptWithClass)) {
                
$parent $node->parentNode;
                
$parent->removeChild($node);
                
$removed++;
            }
        }

        return 
$removed;
    }

    
/**
     * @param DOMNode $node
     * @param array $exceptWithClass
     *
     * @return bool
     */
    
private function shouldNodeBeRemoved($node, array $exceptWithClass)
    {
        if (
$exceptWithClass === array()) {
            
$result true;
        } else {
            
$classAttribute $node->attributes->getNamedItem('class');
            if (
$classAttribute instanceof DOMAttr) {
                
$classNames explode(' '$classAttribute->value);

                
$result array_intersect($exceptWithClass$classNames) === array();
            } else {
                
$result true;
            }
        }

        return 
$result;
    }
}
?>
  FOK!mycroftheld zondag 8 november 2015 @ 06:52:31 #108
128465 verified  bondage
pi_157395524
quote:
0s.gif Op zaterdag 7 november 2015 22:58 schreef Light het volgende:

[..]

Ik heb ondertussen ook even geprobeerd dit op te lossen en er zijn een paar punten waar je rekening mee moet houden. Dit is mijn oplossing:
[ code verwijderd ]

Dankje _O_ Ik wou er vandaag even mee aan de slag en dit komt goed van pas, hoef ik het zelf niet uit te zoeken.
pi_157395826
quote:
0s.gif Op zaterdag 7 november 2015 20:46 schreef Light het volgende:
Waarom maximaal 30 tekens en geen spaties voor een wachtwoord? Als het goed is, sla je ze toch goed gehashed op en dan maken spaties en het aantal tekens niet zo heel veel uit.
Was even een voorbeeld.
De ene keer geef je aan dat een element te kort of te lang is, een missende teken of andere problemen heeft, mijn huidige manier is dat ik alles meld, dus alle mogelijke fouten.

Maar goed, misschien dat mensen dit op verschillende manieren aanpakken.

Javascript check doen we niet aan :@
Just say hi!
  zondag 8 november 2015 @ 11:00:57 #110
230788 n8n
Pragmatisch
pi_157396936
Alleen de relevante fouten natuurlijk. Het liefst realtime (JS) en met propere feedback voor het input veld.

Bij wachtwoorden moet je minimaal 8 karakters doen en voorkomen dat men bij wijzigen een eerder gebruikt wachtwoord instelt. Alle verdere eisen zijn alleen maar irritant.


En waarom in godsnaam zulke eisen voor een naam.
Specialization is for insects”.—Robert Heinlein
pi_157397018
Sterker nog, als je dergelijke uitgebreide eisen hanteert kun je doorgaans beter gewoon zelf de wachtwoorden genereren.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  FOK!mycroftheld zondag 8 november 2015 @ 12:28:20 #112
128465 verified  bondage
pi_157398125
quote:
0s.gif Op zaterdag 7 november 2015 22:58 schreef Light het volgende:

[..]

Ik heb ondertussen ook even geprobeerd dit op te lossen en er zijn een paar punten waar je rekening mee moet houden. Dit is mijn oplossing:
[ code verwijderd ]

Inmiddels geïmplementeerd en werkt, mijn dank is groot. Heb wel een kleine wijziging aangebracht omdat ik (indien gewenst) het element graag wil vervangen.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
    
public function removeElements($tagName, array $exceptWithClass = array(), $replaceWith = array()) {
        
$removed 0;

        
$doc $this->document;

        
// This list is dynamic. Any change in the document will immediately be reflected here
        
$nodes $doc->getElementsByTagName($tagName);

        for(
$nodeIndex $nodes->length 1$nodeIndex >= 0$nodeIndex--) {
            
$node $nodes->item($nodeIndex);
            if(
$this->shouldNodeBeRemoved($node$exceptWithClass)) {
                
$parent $node->parentNode;
                if(isset(
$replaceWith['element']) && isset($replaceWith['contents'])) {
                    
$replace_node $doc->createElement($replaceWith['element'], $replaceWith['contents']);
                    
$parent->replaceChild($replace_node$node);
                }else{
                    
$parent->removeChild($node);
                }

                
$removed++;
            }
        }

        return 
$removed;
    }
?>


[ Bericht 3% gewijzigd door bondage op 08-11-2015 12:36:17 (wijzigingen in code...) ]
  maandag 16 november 2015 @ 15:54:35 #113
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157600741
Heeft iemand hier ervaring met utf-8 troubleshooting?
pi_157600846
quote:
0s.gif Op maandag 16 november 2015 15:54 schreef Ser_Ciappelletto het volgende:
Heeft iemand hier ervaring met utf-8 troubleshooting?
Iets specifieker ;)
Be curious, not judgmental
  maandag 16 november 2015 @ 16:10:20 #115
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157601141
quote:
7s.gif Op maandag 16 november 2015 15:58 schreef Aether het volgende:

[..]

Iets specifieker ;)
Ik heb een html-pagina die met require_once een php-scriptje aanroept, dat Griekse letters uit een MySQL-database queriet en in een tabel echoot.

De database is gecreëerd met DEFAULT CHARACTER SET "utf-8" en DEFAULT COLLATE utf8_general_ci. De default charset is in php.ini ingestelt op "utf-8". De HTML-pagina heeft in de header <meta charset="utf8"> staan. En nog krijg ik allemaal ????'jes in plaats Griekse letters...
pi_157601219
quote:
0s.gif Op maandag 16 november 2015 16:10 schreef Ser_Ciappelletto het volgende:

[..]

Ik heb een html-pagina die met require_once een php-scriptje aanroept, dat Griekse letters uit een MySQL-database queriet en in een tabel echoot.

De database is gecreëerd met DEFAULT CHARACTER SET "utf-8" en DEFAULT COLLATE utf8_general_ci. De default charset is in php.ini ingestelt op "utf-8". De HTML-pagina heeft in de header <meta charset="utf8"> staan. En nog krijg ik allemaal ????'jes in plaats Griekse letters...
Lastig om zo te zeggen waar het probleem zit.
Probeer eens bovenin je script:
1header('Content-Type: text/html; charset=utf-8');
Be curious, not judgmental
  maandag 16 november 2015 @ 16:16:39 #117
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157601311
quote:
7s.gif Op maandag 16 november 2015 16:13 schreef Aether het volgende:

[..]

Lastig om zo te zeggen waar het probleem zit.
Probeer eens bovenin je script:
[ code verwijderd ]

Die had ik al gevonden, maar dat helpt helaas niet. ;)
  † In Memoriam † maandag 16 november 2015 @ 16:23:42 #118
159335 Boze_Appel
Vrij Fruit
pi_157601459
quote:
0s.gif Op zaterdag 7 november 2015 19:08 schreef Chandler het volgende:
Vraagje, stel je hebt een formulier met gebruikersnaam en wachtwoord.

Beide elementen moeten voldoen aan veel eisen.

Naam ; minimaal 6, maximaal 30 tekens. Geen spaties en bepaalde karakters, Geen herhalingen van letters (3x een e achter elkaar bv). En minimaal 1 hoofdletter.
Wachtwoord: minimaal 6, maximaal 30 tekens. Geen spaties. Minimaal 1 teken, 1 cijfer en 1 hoofdletter.

Hoe ga je om met gevonden fouten als je het formulier controleert??
Websites die zulke eisen stellen aan wachtwoorden moeten door de internetshredder. Wat een ellende.
Carpe Libertatem
  maandag 16 november 2015 @ 17:33:53 #119
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157603307
quote:
0s.gif Op maandag 16 november 2015 16:16 schreef Ser_Ciappelletto het volgende:

[..]

Die had ik al gevonden, maar dat helpt helaas niet. ;)
Dit toevoegen werkt om de een of andere reden wel...

1mysqli_set_charset($conn, "utf8");
pi_157632888
quote:
0s.gif Op maandag 16 november 2015 17:33 schreef Ser_Ciappelletto het volgende:

[..]

Dit toevoegen werkt om de een of andere reden wel...
[ code verwijderd ]

Aan te raden is om PDO te gebruiken i.p.v. mysqli.
  dinsdag 17 november 2015 @ 20:53:20 #121
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157633018
quote:
1s.gif Op dinsdag 17 november 2015 20:50 schreef robin007bond het volgende:

[..]

Aan te raden is om PDO te gebruiken i.p.v. mysqli.
Wat is het verschil? Zijn die commando's verder hetzelfde?
pi_157633353
quote:
0s.gif Op dinsdag 17 november 2015 20:53 schreef Ser_Ciappelletto het volgende:

[..]

Wat is het verschil? Zijn die commando's verder hetzelfde?
PDO heeft ondersteuning voor meerdere databases en is objectgeoriënteerd. Eigenlijk is PDO een abstractielaag.
  dinsdag 17 november 2015 @ 21:09:05 #123
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157633556
quote:
1s.gif Op dinsdag 17 november 2015 21:03 schreef robin007bond het volgende:

[..]

PDO heeft ondersteuning voor meerdere databases en is objectgeoriënteerd. Eigenlijk is PDO een abstractielaag.
Hmm, die syntax ziet er in ieder geval al een stuk logischer uit dan die van mysqli.
pi_157633925
quote:
0s.gif Op dinsdag 17 november 2015 21:09 schreef Ser_Ciappelletto het volgende:

[..]

Hmm, die syntax ziet er in ieder geval al een stuk logischer uit dan die van mysqli.
En als je migreert naar een andere database hoef je maar één tekstregeltje veranderen. Dat is een groot voordeel.

Wil je beschermen tegen SQL-injecties, kijk dan ook naar het gebruik van bindParam.

[ Bericht 1% gewijzigd door #ANONIEM op 17-11-2015 21:19:35 ]
pi_157635605
quote:
15s.gif Op maandag 16 november 2015 16:23 schreef Boze_Appel het volgende:

[..]

Websites die zulke eisen stellen aan wachtwoorden moeten door de internetshredder. Wat een ellende.
Met zulke wachtwoordeisen hoef je je sowieso geen zorgen te maken om de functies om een nieuwe gebruiker aan te maken. Die worden dan toch nooit aangeroepen ^O^

En idd PDO ^O^
De enige reden om geen PDO te gebruiken is als je een ORM gebruikt (die dan vast en zeker weer PDO gebruikt)
pi_157635922
Yeahhhh Doctrine.
pi_157635949
Alleen wordt het soms wel een clusterfuck met al die annotations. Django's ORM vind ik een stuk mooier.
pi_157637818
quote:
1s.gif Op dinsdag 17 november 2015 21:19 schreef robin007bond het volgende:

[..]

En als je migreert naar een andere database hoef je maar één tekstregeltje veranderen. Dat is een groot voordeel.
En dan hopen dat je andere database hetzelfde SQL-dialect spreekt. Dat is, ook bij relationele databases, niet gegarandeerd.
pi_157639715
quote:
9s.gif Op dinsdag 17 november 2015 22:15 schreef robin007bond het volgende:
Alleen wordt het soms wel een clusterfuck met al die annotations. Django's ORM vind ik een stuk mooier.
Ik weet niet wat de Django ORM gebruikt, maar bij Doctrine kun je ook gebruik maken van yaml of xml of gewoon php voor je mapping. Niet dat het daar overzichtelijker van wordt, maar 't kan wel :)
  woensdag 18 november 2015 @ 11:07:12 #130
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157643572
Is het zo dat je in PHP vanuit een function geen beroep kan doen op een eerder geopende connectie? Hoe is dat het makkelijkste op te lossen zonder in iedere function terug die connectie te moeten openen?

Oh, en ik kan niet dezelfde functie tweemaal achtereen aanroepen met verschillende argumenten? Als ik ze allebei heb staan, werkt alleen de eerste. Als ik de eerste wegcomment, werkt de tweede perfect. --> oplossing was om de connectie correct te sluiten. :')

[ Bericht 25% gewijzigd door Ser_Ciappelletto op 18-11-2015 12:57:22 ]
pi_157647112
quote:
0s.gif Op woensdag 18 november 2015 11:07 schreef Ser_Ciappelletto het volgende:
Is het zo dat je in PHP vanuit een function geen beroep kan doen op een eerder geopende connectie? Hoe is dat het makkelijkste op te lossen zonder in iedere function terug die connectie te moeten openen?

Oh, en ik kan niet dezelfde functie tweemaal achtereen aanroepen met verschillende argumenten? Als ik ze allebei heb staan, werkt alleen de eerste. Als ik de eerste wegcomment, werkt de tweede perfect. --> oplossing was om de connectie correct te sluiten. :')
Voor dergelijke connections gebruik je in PHP vaak een Singleton, zie dit voorbeeldje.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  woensdag 18 november 2015 @ 14:13:21 #132
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157647396
quote:
0s.gif Op woensdag 18 november 2015 13:59 schreef Monolith het volgende:

[..]

Voor dergelijke connections gebruik je in PHP vaak een Singleton, zie dit voorbeeldje.
Zo te zien heb ik daar niets aan, want het zijn verbindingen met twee verschillende databases. Als !$dbConn == false, kan er nog een nieuwe verbinding aangemaakt moeten worden voor de andere database.
pi_157656294
quote:
0s.gif Op woensdag 18 november 2015 13:59 schreef Monolith het volgende:

[..]

Voor dergelijke connections gebruik je in PHP vaak een Singleton, zie dit voorbeeldje.
Nee, met een singleton kun je maar 1 instance hebben dus dan ga je nooit connecties naar 2 databases kunnen hebben. Die beperking is niet handig.

Je kunt gewoon meer dan 1 PDO connectie openen:
1
2
3
4
<?php
$db1 
= new PDO('mysql://dbname=db1;host=localhost''user1''pass1');
$db2 = new PDO('mysql://dbname=db2;host=my.external.db.server''user2''pass2');
?>
pi_157656495
quote:
0s.gif Op woensdag 18 november 2015 20:10 schreef Light het volgende:

[..]

Nee, met een singleton kun je maar 1 instance hebben dus dan ga je nooit connecties naar 2 databases kunnen hebben. Die beperking is niet handig.

Je kunt gewoon meer dan 1 PDO connectie openen:
[ code verwijderd ]

Dat hoeft niet hoor. Met een singleton kun je best meerdere connection objecten beheren als je dat zou willen. Die eis had ik overigens gemist in het oorspronkelijke verhaal.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_157656571
quote:
0s.gif Op woensdag 18 november 2015 11:07 schreef Ser_Ciappelletto het volgende:
Is het zo dat je in PHP vanuit een function geen beroep kan doen op een eerder geopende connectie? Hoe is dat het makkelijkste op te lossen zonder in iedere function terug die connectie te moeten openen?
Iedere class die db-toegang nodig heeft, moet als constructor-parameter hebben voor een database-verbinding (of een setter om dat in te stellen, maar dan heb je meer kans dat het vergeten wordt). Dat wordt een class property en daar kun je vanuit iedere method in die class bij. En in plaats van een PDO-object kun je ook een wrapper maken om PDO of op een andere manier een abstractielaag gebruiken. PDO extenden is een slecht idee.
quote:
Oh, en ik kan niet dezelfde functie tweemaal achtereen aanroepen met verschillende argumenten? Als ik ze allebei heb staan, werkt alleen de eerste. Als ik de eerste wegcomment, werkt de tweede perfect. --> oplossing was om de connectie correct te sluiten. :')
Een functie twee maal aanroepen met verschillende argumenten, hoort gewoon te werken, maar als het mis gaat door database-connecties kan het wel zijn dat het aantal openstaande connecties tegen het maximum van de database-server zit...
pi_157657950
quote:
1s.gif Op woensdag 18 november 2015 20:15 schreef Monolith het volgende:

[..]

Dat hoeft niet hoor. Met een singleton kun je best meerdere connection objecten beheren als je dat zou willen. Die eis had ik overigens gemist in het oorspronkelijke verhaal.
Misschien had ik het oorspronkelijke verhaal in eerste instantie ook niet goed gelezen.

Maar ik ben sowieso geen fan van singletons. Het voorbeeld in het artikel is geschikt voor 1 database-verbinding. Als je met 2 databases wilt kunnen verbinden, zul je waarschijnlijk veel code moeten copy-pasten (duplicate code, antipattern). (En wat nou als ik morgen een use-case heb met 10 databases? Alles maar 10x copy-pasten?)

Verder zijn de gegevens voor het maken van de verbinding hardcoded, da's ook niet handig (misschien alleen gedaan met het oog op het voorbeeld, maar toch). Die credentials moeten ergens vandaan komen, en je kunt ze slecht aanleveren. Maar als die DbConn zelf op zoek moet naar de credentials die ergens in een config file staan, gaat dat ten koste van herbruikbaarheid.

Verder wordt er bij de singleton gebruik gemaakt van static method calls en die zijn notoir slecht te mocken voor gebruik in tests. Als je een object van class Foo verwacht, kan ik je ook een object van Bar geven als Bar extends Foo. Dan moet ik alleen zorgen dat de methods die je aanroept wel iets teruggeven waar je mee verder kunt. Bij static method calls lukt dat niet, omdat overal in de code wordt verwezen naar de class Foo en mijn mock methods in Bar dus niet worden aangeroepen.

En ja, bij testen wil ik mocks kunnen gebruiken. Helemaal van iets als een database-connection. Als ik iets doe met het resultaat van een functie van een andere class, wil ik in mijn test niet weten hoe die andere class dat resultaat heeft bedacht maar alleen of mijn method goed kan omgaan met het gegeven resultaat.
pi_157661731
quote:
0s.gif Op woensdag 18 november 2015 20:55 schreef Light het volgende:

[..]

Misschien had ik het oorspronkelijke verhaal in eerste instantie ook niet goed gelezen.

Maar ik ben sowieso geen fan van singletons. Het voorbeeld in het artikel is geschikt voor 1 database-verbinding. Als je met 2 databases wilt kunnen verbinden, zul je waarschijnlijk veel code moeten copy-pasten (duplicate code, antipattern). (En wat nou als ik morgen een use-case heb met 10 databases? Alles maar 10x copy-pasten?)

Verder zijn de gegevens voor het maken van de verbinding hardcoded, da's ook niet handig (misschien alleen gedaan met het oog op het voorbeeld, maar toch). Die credentials moeten ergens vandaan komen, en je kunt ze slecht aanleveren. Maar als die DbConn zelf op zoek moet naar de credentials die ergens in een config file staan, gaat dat ten koste van herbruikbaarheid.

Verder wordt er bij de singleton gebruik gemaakt van static method calls en die zijn notoir slecht te mocken voor gebruik in tests. Als je een object van class Foo verwacht, kan ik je ook een object van Bar geven als Bar extends Foo. Dan moet ik alleen zorgen dat de methods die je aanroept wel iets teruggeven waar je mee verder kunt. Bij static method calls lukt dat niet, omdat overal in de code wordt verwezen naar de class Foo en mijn mock methods in Bar dus niet worden aangeroepen.

En ja, bij testen wil ik mocks kunnen gebruiken. Helemaal van iets als een database-connection. Als ik iets doe met het resultaat van een functie van een andere class, wil ik in mijn test niet weten hoe die andere class dat resultaat heeft bedacht maar alleen of mijn method goed kan omgaan met het gegeven resultaat.
Als ik een fatsoenlijke applicatie wil maken, dan gebruik ik geen PHP. Maar dat terzijde. :P

Een singleton is een pattern met als doel iets te maken waar je er slechts één van kunt hebben. In het geval van PHP is dat vaak een DB connectie.
Dat zegt natuurlijk verder niets over hoe je credentials injecteert. Doorgaans gebruik je daar gewoon vormen van property of dependency injection voor.

Ik heb al te lang niet veel met PHP gedaan om nog echt te weten welke mocking frameworks PHP heeft, maar doorgaans niet het mocken van static functies niet zo'n punt zijn. Bovendien, Singletons subsclasses is doorgaans niet de bedoeling. Ik zou ze ook gewoon final maken.

Ik kan overigens zo legio manieren bedenken om zonder duplicate code een wat uitgebreidere singleton instantie te maken die een verzameling aan connecties bijhoudt.
Bij voorkeur gebruik je gewoon een framework met een beetje fatsoenlijke ORM of OGM support natuurlijk.

[ Bericht 1% gewijzigd door Monolith op 19-11-2015 09:37:55 ]
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  donderdag 19 november 2015 @ 16:01:15 #138
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157671282
Oké, even een serieuze vraag:

voor mijn site moet ik telkens drie elementen op een pagina hebben: een titel, een grammatica-tabel en een bijschrift met uitleg enzo. Om praktische redenen (met name dat ik geen 20+ enorme html-tabellen wil typen) is het geen optie om voor ieder fenomeen een eigen html-pagina aan te maken. Daarom gebruik ik PHP om dingen uit te lezen.

Momenteel heb ik dat zo opgezet dat de titel en het bijschrift uit een .txt-bestandje in een map worden gelezen en de tabel als tabel uit een MySQL-database gehaald wordt. Maar eigenlijk vind ik dat best wel een stomme oplossing. Het liefst zou ik dat allemaal in een database zetten.

Het probleem is dat er in die tabel dus een andere tabel vervat moet zijn. Dan kan ik die aan de hand van het ID uitlezen en op de site plaatsen. Het houdt alles een stuk meer centraal en overzichtelijk. De My-SQL-tabel zou er dan zo uit moeten zien:

1
2
3
4
5
6
7
8
+-----+ ----------+----------+--------------+
| ID  | Titel     | Tabel    | Bijschrift   |
+-----+-----------+----------+--------------+
| 1   | Eerste    | Tabel1   | Bladiebla    |
| 2   | Tweede    | Tabel2   | Lalalala     |
| 3   | Derde     | Tabel3   | Nogmeer      |
| 4   | Vierde    | Tabel4   | Yapyapyp     |
+-----+-----------+----------+--------------+
En die Tabel# zou dan een grammatica-tabel moeten zijn (zoals in de pics die ik eerder postte).

Ik heb overwogen om in Tabel# gewoon de ganse HTML-tabel in te lezen maar dat lijkt me overdreven veel werk en bijzonder onelegant. Zijn hier betere methoden voor?
pi_157688693
Nooit van joins gehoord?
  vrijdag 20 november 2015 @ 10:58:19 #140
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157688710
quote:
14s.gif Op vrijdag 20 november 2015 10:56 schreef KomtTijd... het volgende:
Nooit van joins gehoord?
Nope. :P

Ik zal me daar eens in inlezen, bedankt. ;)
pi_157689651
quote:
14s.gif Op vrijdag 20 november 2015 10:56 schreef KomtTijd... het volgende:
Nooit van joins gehoord?
Je vraagt je af of mensen zich überhaupt wel eens de vraag hebben gesteld waarom die dingen RELATIONELE databases heten. :P
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
  vrijdag 20 november 2015 @ 19:50:07 #142
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157700197
Heel leuk die joins, maar hoe zet ik nou de ene tabel in de andere? Beter gezegd: wat moet ik in mijn tabel 'compleet' onder 'tabel' zetten om de tabel 'lidwoorden' op te roepen?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+----+------------+-------+------------------------+
| id | titel      | tabel | bijschrift             |
+----+------------+-------+------------------------+
|  1 | Lidwoorden |       | Dit zijn de lidwoorden |
+----+------------+-------+------------------------+

+-------------+-----------+------------+-----------+
| Naamval     | Mannelijk | Vrouwelijk | Onzijdig  |
+-------------+-----------+------------+-----------+
| Nominativus | ὁ         | ἡ          | τό        |
| Genitivus   | τοῦ       | τῆς        | τοῦ       |
| Dativus     | τῷ        | τῇ         | τῷ        |
| Accusativus | τόν       | τήν        | τό        |
| Nominativus | οἱ        | αἱ         | τά        |
| Genitivus   | τῶν       | τῶν        | τῶν       |
| Dativus     | τοῖς      | ταῖς       | τοῖς      |
| Accusativus | τούς      | τάς        | τά        |
+-------------+-----------+------------+-----------+

Ik kan trouwens 'lidwoorden' neerzetten en dat terug invoeren in een query om die tabel op te vragen, maar is daar geen makkelijkere oplossing voor?
pi_157701111
Doe eens een stap terug, wat wil je nu precies laten zien op de pagina?
pi_157701228
Wat me vooral niet helemaal duidelijk is, is de structuur van de tweede tabel. Ik begrijp dat je min of meer meerdere tabellen hebt met woorden in alle naamvallen, maar hoe sla je die precies op in je SQL database?
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_157709892
quote:
0s.gif Op woensdag 18 november 2015 23:16 schreef Monolith het volgende:

[..]

Als ik een fatsoenlijke applicatie wil maken, dan gebruik ik geen PHP. Maar dat terzijde. :P
PHP heeft voor- en nadelen. Maar laten we hier geen discussietopic over maken over of je wel of niet php moet gebruiken.
quote:
Een singleton is een pattern met als doel iets te maken waar je er slechts één van kunt hebben. In het geval van PHP is dat vaak een DB connectie.
Dat zegt natuurlijk verder niets over hoe je credentials injecteert. Doorgaans gebruik je daar gewoon vormen van property of dependency injection voor.
Vaak, dus niet altijd. Een goede ORM staat je toe om meer dan 1 db-connectie te maken. Daarnaast gaat credential injection niet handig werken als je een private constructor hebt (om een singleton te bouwen). Je weet immers niet wanneer de singleton wordt aangemaakt.
quote:
Ik heb al te lang niet veel met PHP gedaan om nog echt te weten welke mocking frameworks PHP heeft, maar doorgaans niet het mocken van static functies niet zo'n punt zijn. Bovendien, Singletons subsclasses is doorgaans niet de bedoeling. Ik zou ze ook gewoon final maken.
In php kun je classes niet final maken. Dat kan wel met methods. De de facto standaard voor Unit Tests in PHP is PhpUnit, uit de xUnit familie. En het mocken van static methods is niet het grootste probleem, het zorgen dat die methods worden aangeroepen wel.

Voorbeeld (pseudo-code, want ik vergeet vast dingen)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
class DbSingleton {
    private 
$connection;
    private static 
$instance;

    private 
__construct() {
        
$this->connection = new PDO(...)
    }

    public static function 
getConnection() {
        if (
self::$instance === null) {
            
self::$instance = new self();
        }
    }
}

class 
Foo {
    public function 
bar() {
        
$result DbSingleton::getConnection()->query(...)->fetchAll()
        return 
$result;
    }
}
?>
Als ik de functie bar in de class Foo wil testen, ben ik niet geïnteresseerd in wat er daadwerkelijk in de database staat. Sterker, ik wil helemaal niet dat de database benaderd wordt. Maar er wordt altijd gebruik gemaakt van de method getConnection in DbSingleton. Die class name staat daar hardcoded, dus je heb niets aan een mock.

(Veel PHP-native classes zijn ook niet te mocken, dus als je het goed wilt doen, bouw je een wrapper om die native classes. Dan heb je naar buiten toe duidelijke methods (zoals getUsers) en kun je ook eenvoudig zorgen dat je niet overal en nergens in je code de database rechtstreeks kunt benaderen.

quote:
Ik kan overigens zo legio manieren bedenken om zonder duplicate code een wat uitgebreidere singleton instantie te maken die een verzameling aan connecties bijhoudt.
Bij voorkeur gebruik je gewoon een framework met een beetje fatsoenlijke ORM of OGM support natuurlijk.
Yep. Doctrine comes to mind. Geen singletons, wel veel gebruikt, goed getest en actief in ontwikkeling.

Er is niets mis met het zelf bouwen van een framework / cms / database abstraction layer / etc. Dat zijn best leerzame projecten. Je moet je echter ook realiseren dat er meer bij komt kijken dan waar je in eerste instantie aan dacht en dat je code dus niet geschikt is voor productie.
  FOK!-Schrikkelbaas zaterdag 21 november 2015 @ 08:02:48 #146
862 Arcee
Look closer
pi_157710866
quote:
0s.gif Op vrijdag 20 november 2015 19:50 schreef Ser_Ciappelletto het volgende:
Heel leuk die joins, maar hoe zet ik nou de ene tabel in de andere? Beter gezegd: wat moet ik in mijn tabel 'compleet' onder 'tabel' zetten om de tabel 'lidwoorden' op te roepen?
[ code verwijderd ]

Ik kan trouwens 'lidwoorden' neerzetten en dat terug invoeren in een query om die tabel op te vragen, maar is daar geen makkelijkere oplossing voor?
Wat je moet doen is het id van de ene tabel opnemen als extern veld in de andere tabel. Dat ziet er dan zo uit:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
+----+------------+------------------------+
| id | titel      | bijschrift             |
+----+------------+------------------------+
|  1 | Lidwoorden | Dit zijn de lidwoorden |
+----+------------+------------------------+

+----------+-------------+-----------+------------+-----------+
| tabel_id | Naamval     | Mannelijk | Vrouwelijk | Onzijdig  |
+----------+-------------+-----------+------------+-----------+
|     1    | Nominativus | ὁ         | ἡ          | τό        |
|     1    | Genitivus   | τοῦ       | τῆς        | τοῦ       |
|     1    | Dativus     | τῷ        | τῇ         | τῷ        |
|     1    | Accusativus | τόν       | τήν        | τό        |
|     1    | Nominativus | οἱ        | αἱ         | τά        |
|     1    | Genitivus   | τῶν       | τῶν        | τῶν       |
|     1    | Dativus     | τοῖς      | ταῖς       | τοῖς      |
|     1    | Accusativus | τούς      | τάς        | τά        |
+----------+-------------+-----------+------------+-----------+

Het veld 'tabel' kan dus weg uit de eerste tabel en het veld 'tabel_id' is toegevoegd aan de tweede. In dat laatste veld komen dus de id's uit de eerste tabel (de records in 'lidwoorden' zouden eventueel ook een eigen id kunnen krijgen, trouwens)

Je linkt ze dan als volgt aan elkaar:

1
2
select * from lidwoorden
join compleet on compleet.id=lidwoorden.tabel_id

Ik heb voor de duidelijkheid de tabellen geen alias gegeven, maar vaak doe je zo:

1
2
select * from lidwoorden l
join compleet c on c.id=l.tabel_id

Je 'zet' dus niet de ene tabel in de andere, maar relateert ze aan elkaar met een join (en met 'select * from' haal je er gegevens uit).

Zo haal je alle velden van beide tabellen op, maar je kunt ook uit beide tabellen alleen bepaalde velden selecteren, bijvoorbeeld zo:

1
2
select l.Naamval, l.Mannelijk, c.titel, c.bijschrift from lidwoorden l
join compleet c on c.id=l.tabel_id


[ Bericht 0% gewijzigd door Arcee op 21-11-2015 08:10:32 ]
  zaterdag 21 november 2015 @ 12:35:09 #147
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_157713356
quote:
0s.gif Op zaterdag 21 november 2015 08:02 schreef Arcee het volgende:

[..]

Wat je moet doen is het id van de ene tabel opnemen als extern veld in de andere tabel. Dat ziet er dan zo uit:
[ code verwijderd ]

Het veld 'tabel' kan dus weg uit de eerste tabel en het veld 'tabel_id' is toegevoegd aan de tweede. In dat laatste veld komen dus de id's uit de eerste tabel (de records in 'lidwoorden' zouden eventueel ook een eigen id kunnen krijgen, trouwens)

Je linkt ze dan als volgt aan elkaar:
[ code verwijderd ]

Ik heb voor de duidelijkheid de tabellen geen alias gegeven, maar vaak doe je zo:
[ code verwijderd ]

Je 'zet' dus niet de ene tabel in de andere, maar relateert ze aan elkaar met een join (en met 'select * from' haal je er gegevens uit).

Zo haal je alle velden van beide tabellen op, maar je kunt ook uit beide tabellen alleen bepaalde velden selecteren, bijvoorbeeld zo:
[ code verwijderd ]

Juist, dat ga ik eens proberen. Bedankt voor de hulp!
  zondag 22 november 2015 @ 14:20:49 #148
118585 Crutch
Filantroop || Taalzwengel
pi_157738226
quote:
0s.gif Op zaterdag 21 november 2015 08:02 schreef Arcee het volgende:

[..]

Wat je moet doen is het id van de ene tabel opnemen als extern veld in de andere tabel. Dat ziet er dan zo uit:
[ code verwijderd ]

Het veld 'tabel' kan dus weg uit de eerste tabel en het veld 'tabel_id' is toegevoegd aan de tweede. In dat laatste veld komen dus de id's uit de eerste tabel (de records in 'lidwoorden' zouden eventueel ook een eigen id kunnen krijgen, trouwens)

Je linkt ze dan als volgt aan elkaar:
[ code verwijderd ]

Ik heb voor de duidelijkheid de tabellen geen alias gegeven, maar vaak doe je zo:
[ code verwijderd ]

Je 'zet' dus niet de ene tabel in de andere, maar relateert ze aan elkaar met een join (en met 'select * from' haal je er gegevens uit).

Zo haal je alle velden van beide tabellen op, maar je kunt ook uit beide tabellen alleen bepaalde velden selecteren, bijvoorbeeld zo:
[ code verwijderd ]

Hulde voor de tijd nemen om het helder en compleet uit te leggen. ^O^
Je moeder is een hamster
  dinsdag 1 december 2015 @ 21:58:42 #149
118011 BrainOverfloW
Fok! around the Clock!
pi_157955868
Even een kort vraagje. Ik heb de volgende code:

1
2
3
4
5
6
7
8
$array = ["One","Two","Three"];

echo serialize($array);

unset($array[1]);
array_values($array);

echo serialize($array);

De eerste echo geeft me:
1a:3:{i:0;s:3:"One";i:1;s:3:"Two";i:2;s:5:"Three";}

De tweede echo geeft me:
1a:2:{i:0;s:3:"One";i:2;s:5:"Three";}

Het verwijderen van het element uit de array gaat op zich dus goed. Maar hoe krijg ik het voor elkaar dat die index (ik neem aan dat die "i" daar voor staat) weer netjes doornummert van 0 naar 1 ipv naar de originele 2.

Alvast bedankt :)
Whether or not you can become great at something, you can always become better.
And one day you'll wake up and find out how good you actually became, having transcended whatever limits you might have thought you couldn't pass.
Neil Degrasse Tyson
pi_157955965
quote:
0s.gif Op dinsdag 1 december 2015 21:58 schreef BrainOverfloW het volgende:
Even een kort vraagje. Ik heb de volgende code:
[ code verwijderd ]

De eerste echo geeft me:
[ code verwijderd ]

De tweede echo geeft me:
[ code verwijderd ]

Het verwijderen van het element uit de array gaat op zich dus goed. Maar hoe krijg ik het voor elkaar dat die index (ik neem aan dat die "i" daar voor staat) weer netjes doornummert van 0 naar 1 ipv naar de originele 2.

Alvast bedankt :)
array_values geeft een array terug. Als je het resultaat gebruikt zou je een element 0 en 1 moeten hebben.
Be curious, not judgmental
  dinsdag 1 december 2015 @ 22:03:08 #151
118011 BrainOverfloW
Fok! around the Clock!
pi_157955994
quote:
1s.gif Op dinsdag 1 december 2015 22:02 schreef Aether het volgende:

[..]

array_values geeft een array terug. Als je het resultaat gebruikt zou je een element 0 en 1 moeten hebben.
^O^ Het zijn altijd de kleine details :)
Whether or not you can become great at something, you can always become better.
And one day you'll wake up and find out how good you actually became, having transcended whatever limits you might have thought you couldn't pass.
Neil Degrasse Tyson
  woensdag 2 december 2015 @ 15:27:59 #152
230788 n8n
Pragmatisch
pi_157965755
Simpel vraagje, in JS kan je een variabele gebruiken wanneer deze bestaat en met dubbele pipes een backup aangeven:

var a = foo || bar; of console.log( foo || bar );

Als foo bestaat wordt deze gebruikt, en anders bar (of als laatst optie false).

Met php wanneer ik <?= $foo || $bar ?> krijg ik een 1 wanneer er een ‘true’ waarde in zit, of 0 als beide ‘false’ zijn. Is er een vergelijkbare constructie als in JS? Een ternary operator kan ook, maar is veel langer.
Specialization is for insects”.—Robert Heinlein
  woensdag 2 december 2015 @ 15:29:30 #153
91039 mstx
2x1/2 = 1/2 x 1/2
pi_157965799
Ja dat zit in PHP7.

<?= $foo ?? $bar ?>
Op donderdag 2 juli 2009 22:41 schreef RTB het volgende:
als ik elk rap"liedje" een kans moest geven was ik aan het eind van dit millennium nog bezig met het tempo waarin die kotshoop uitgebraakt wordt.
👾
  woensdag 2 december 2015 @ 15:31:00 #154
230788 n8n
Pragmatisch
pi_157965827
quote:
14s.gif Op woensdag 2 december 2015 15:29 schreef mstx het volgende:
Ja dat zit in PHP7.

<?= $foo ?? $bar ?>
Ik helemaal blij...

...oh in 7. ;(

Dankjewel, heb er nu niks aan maar beter dat het er aan komt ?? eindelijk is.
Specialization is for insects”.—Robert Heinlein
  woensdag 2 december 2015 @ 16:26:52 #155
12221 Tijn
Powered by MS Paint
pi_157966771
Je kunt er wel vrij makkelijk zelf een functie voor klussen natuurlijk.

1
2
3
4
5
<?php
function def($a$b) {
  return (
$a) ? $a $b;
}
?>

1<?php echo def($foo$bar); ?>


[ Bericht 11% gewijzigd door Tijn op 02-12-2015 16:54:44 ]
pi_157966927
quote:
3s.gif Op woensdag 2 december 2015 16:26 schreef Tijn het volgende:
Je kunt er wel vrij makkelijk zelf een functie voor klussen natuurlijk.
[ code verwijderd ]

[ code verwijderd ]

Of je voegt even een eigen operator toe. :P
Zie bijvoorbeeld deze uitleg.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_158061628
Hallo!

Ik opende net een topic met de vraag of iemand misschien wist hoe ik mijn contact formulier werkend kan krijgen en toen werd ik doorverwezen naar dit topic, dus zal mijn post even ordinair kopiëren :P:

Ik moet voor mijn studie mijn eerste website maken met html en css. Ik heb het mezelf lekker makkelijk gemaakt door een template te gebruiken, maar nu blijk ik mijn contact formulier niet werkend te krijgen.

Ik heb een contact.html, een MailHandler.php, een libmail.php en een TMForm.js bestand die er volgens mij allemaal mee te maken hebben.
Wanneer ik een mail wil versturen, verschijnt er een gifje die laat zien dat die aan het laden is, maar in plaats van dat er "succes" verschijnt, blijft het voor eeuwig laden. Ik ontvang ook geen mail verder. Hopelijk is er een Fokker die me uit de brand kan helpen. :)

Zo ziet het formulier eruit voor en nadat ik een mail stuur:

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Dit is de code:
Ik heb mijn mail adres in de HTML en PHP code even verandert naar mail@email.nl.
SPOILER: HTML
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER: MailHandler.php
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER: TMForm.js
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Bij voorbaat dank!

[ Bericht 5% gewijzigd door Cikx op 07-12-2015 01:19:45 ]
pi_158069438
Post gewoon je code en/of een link naar je testsetup, die plaatjes zijn onleesbaar.

Tevens moet je gewoon beginnen met debuggen. Zoek uit waar je script op vastloopt. Wordt het client-side script goed doorlopen (gebruik je JS console!)? Wordt de request naar de server uitgevoerd? Worden de juiste parameters hierbij meegestuurd? Krijg je een foutmelding terug? Zo nee, staat display_errors en error_reporting hoog genoeg? Zo ja, zorg dat je de foutmeldingen begrijpt (googlen!)... Etc etc etc.

Scripts werken (bijna) nooit in één keer goed, zonder bovenstaande stappen goed onder de knie te krijgen kom je nergens.
pi_158071462
quote:
14s.gif Op zondag 6 december 2015 22:53 schreef KomtTijd... het volgende:
Post gewoon je code en/of een link naar je testsetup, die plaatjes zijn onleesbaar.

Tevens moet je gewoon beginnen met debuggen. Zoek uit waar je script op vastloopt. Wordt het client-side script goed doorlopen (gebruik je JS console!)? Wordt de request naar de server uitgevoerd? Worden de juiste parameters hierbij meegestuurd? Krijg je een foutmelding terug? Zo nee, staat display_errors en error_reporting hoog genoeg? Zo ja, zorg dat je de foutmeldingen begrijpt (googlen!)... Etc etc etc.

Scripts werken (bijna) nooit in één keer goed, zonder bovenstaande stappen goed onder de knie te krijgen kom je nergens.
Heb de de plaatjes vervangen door de code. :)

Heb overigens geprobeerd te doen wat je zei en dit keer staat er wel succes! wanneer ik een mail stuur, het komt alleen niet aan. Ik krijg verder ook geen error melding bij de JS console. Misschien dat het aan die SMTP server settings ligt.. Ik weet niet goed wat ik daar nou mee aanmoet.
pi_158076570
Verder met debuggen dus. Zorg dat je zeker weet dat je php error reporting aan en hoog genoeg staat, en kijk hoe ver je script wél komt door af-en-toe iets te echo'en.
  vrijdag 11 december 2015 @ 13:05:09 #161
25889 Sitethief
Fulltime Flapdrol
pi_158170109
:( Collega's die Many-to-Many in MySQL niet snappen...

Gebruikers zijn gekoppeld aan objecten, gebruikers kunnen meerdere objecten hebben. Dus dit gaat via een koppeltabel.
Een gebruiker heeft binnen een object op drie verschillende onderdelen een van 3 verschillende rechtenniveau's

Had die collega van mij gewoon voor ieder onderdeel én rechteniveau een aparte entry in die koppeltabel. Waardoor een gebruiker dus in maar liefst 9 entries aan hetzelfde object gekoppeld was. En ik kreeg hem maar niet aan het verstand waarom dat niet handig is...
Stroek: Sitethief, die is heel groot en sterk :Y.
Faat: *zucht* zoals gewoonlijk hoor Sitethief weer in de bocht &gt;:)
pi_158172283
Jamaar een database werkt toch net als een spreadsheet?
  † In Memoriam † vrijdag 11 december 2015 @ 15:14:40 #163
159335 Boze_Appel
Vrij Fruit
pi_158172647
quote:
17s.gif Op vrijdag 11 december 2015 14:58 schreef KomtTijd... het volgende:
Jamaar een database werkt toch net als een spreadsheet?
Helaas maar al te waar voor de meeste kaartenbakken databases.
Carpe Libertatem
  vrijdag 11 december 2015 @ 16:03:27 #164
25889 Sitethief
Fulltime Flapdrol
pi_158173756
quote:
17s.gif Op vrijdag 11 december 2015 14:58 schreef KomtTijd... het volgende:
Jamaar een database werkt toch net als een spreadsheet?
_O-

Ik wijt het aan onervarenheid, hij werkt nu net 6 maanden als Dev bij ons. Maar ja, dan bied ik mijn eigen ervaringen aan zodat hij niet in dezelfde valkuilen loopt en dan is meneer te koppig om van mij aan te nemen dat dit later problemen oplevert...
Tis jammer de de tijd en ruimte er nu niet is om hem zelf die valkuil in en uit te laten gaan.
Stroek: Sitethief, die is heel groot en sterk :Y.
Faat: *zucht* zoals gewoonlijk hoor Sitethief weer in de bocht &gt;:)
pi_158174033
quote:
9s.gif Op vrijdag 11 december 2015 15:14 schreef Boze_Appel het volgende:

[..]

Helaas maar al te waar voor de meeste kaartenbakken databases.
Ach, zo'n Cassandra of Mongo database is ook niet veel meer dan een veredelde kaartenbak. :P
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_158179959
quote:
0s.gif Op zondag 6 december 2015 17:48 schreef Cikx het volgende:
Hallo!

Ik opende net een topic met de vraag of iemand misschien wist hoe ik mijn contact formulier werkend kan krijgen en toen werd ik doorverwezen naar dit topic, dus zal mijn post even ordinair kopiëren :P:

Ik moet voor mijn studie mijn eerste website maken met html en css. Ik heb het mezelf lekker makkelijk gemaakt door een template te gebruiken, maar nu blijk ik mijn contact formulier niet werkend te krijgen.

Ik heb een contact.html, een MailHandler.php, een libmail.php en een TMForm.js bestand die er volgens mij allemaal mee te maken hebben.
Wanneer ik een mail wil versturen, verschijnt er een gifje die laat zien dat die aan het laden is, maar in plaats van dat er "succes" verschijnt, blijft het voor eeuwig laden. Ik ontvang ook geen mail verder. Hopelijk is er een Fokker die me uit de brand kan helpen. :)

Zo ziet het formulier eruit voor en nadat ik een mail stuur:

SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Dit is de code:
Ik heb mijn mail adres in de HTML en PHP code even verandert naar mail@email.nl.
SPOILER: HTML
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER: MailHandler.php
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
SPOILER: TMForm.js
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Bij voorbaat dank!
:P Je hebt het jezelf al makkelijk gemaakt door een template te pakken, en het laatste stukje wat je zelf moet doen vraag je nu hier?
pi_158180016
Iemdand zijn of haar app al getest met PHP7?

Zelf nog niet verder gekomen dan dit, met nginx 1.9.3

:o
pi_158181710
quote:
19s.gif Op vrijdag 11 december 2015 20:53 schreef TwenteFC het volgende:

[..]

:P Je hebt het jezelf al makkelijk gemaakt door een template te pakken, en het laatste stukje wat je zelf moet doen vraag je nu hier?
Het is nou eenmaal mijn eerste site en het werd sterk aangeraden om een template te gebruiken, aangezien de site voornamelijk wordt beoordeeld op de toegankelijkheid en hoe het eruit ziet. Overigens heb ik toch wel zo'n 15-20 uur aan de site zitten sleutelen om uit te vogelen hoe alles werkt en om het naar wens te laten functioneren. Dus het is zeker niet zo dat dit het enige is wat ik hoef te doen en het uit luiigheid hier maar vraag, mocht dat zo overkomen. :P De PHP-code kost me nou eenmaal wat moeite om onder de knie te krijgen en na flink wat gegoogled te hebben leek het me handiger om de specifieke vraag hier maar te stellen in plaats van mogelijk nog tot in den treure naar oplossingen te zoeken, zeker als het betrekkelijk simpel is voor jullie.

Maar goed, heb veel gehad aan de tips om de foutmeldingen op te sporen. Het blijkt nu zo te zijn dat ik een host nodig heb voor het mailverkeer. M'n tutor heeft echter pas geleden laten weten dat PHP zaken zoals zoekbalken of contact formulieren niet nodig zijn. Ik ben dus maar van plan om eerst de rest helemaal uit te werken en mocht ik nog tijd over hebben dan ga ik er maar weer voor zitten. Overigens heeft een andere Fokker zijn hulp aangeboden dus dat is erg tof. :)
pi_158192552
quote:
0s.gif Op vrijdag 11 december 2015 21:45 schreef Cikx het volgende:

[..]

Het is nou eenmaal mijn eerste site en het werd sterk aangeraden om een template te gebruiken, aangezien de site voornamelijk wordt beoordeeld op de toegankelijkheid en hoe het eruit ziet. Overigens heb ik toch wel zo'n 15-20 uur aan de site zitten sleutelen om uit te vogelen hoe alles werkt en om het naar wens te laten functioneren. Dus het is zeker niet zo dat dit het enige is wat ik hoef te doen en het uit luiigheid hier maar vraag, mocht dat zo overkomen. :P De PHP-code kost me nou eenmaal wat moeite om onder de knie te krijgen en na flink wat gegoogled te hebben leek het me handiger om de specifieke vraag hier maar te stellen in plaats van mogelijk nog tot in den treure naar oplossingen te zoeken, zeker als het betrekkelijk simpel is voor jullie.

Maar goed, heb veel gehad aan de tips om de foutmeldingen op te sporen. Het blijkt nu zo te zijn dat ik een host nodig heb voor het mailverkeer. M'n tutor heeft echter pas geleden laten weten dat PHP zaken zoals zoekbalken of contact formulieren niet nodig zijn. Ik ben dus maar van plan om eerst de rest helemaal uit te werken en mocht ik nog tijd over hebben dan ga ik er maar weer voor zitten. Overigens heeft een andere Fokker zijn hulp aangeboden dus dat is erg tof. :)
Ah kijk dat wist ik niet, zoeken en vragen is ook een groot onderdeel van ontwikkelen, tot op een zekere hoogte, dus dat neem ik je niet kwalijk hoor ;).
pi_158192808
quote:
0s.gif Op vrijdag 11 december 2015 21:45 schreef Cikx het volgende:

[..]

Maar goed, heb veel gehad aan de tips om de foutmeldingen op te sporen. Het blijkt nu zo te zijn dat ik een host nodig heb voor het mailverkeer.
^O^ Goed dat je dat inmiddels zelf uitgevonden hebt! En dat je het hier laat weten, vinden de mensen die je helpen ook weer leuk om te horen ;)
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 13:59:35 #171
1972 Swetsenegger
Egocentrische Narcist
pi_158282211
Ik loop even klem, ik denk dat ik een subquery moet gaan bouwen, maar even controleren met jullie :)

Ik heb een UPDATE query waarbij de WHERE clause een rijtje ID's is die uit een formulier submit komt:

1
2
3
4
5
<?php
$productIDs 
array_values($_POST['assigned']);
$query "UPDATE products SET seasonAction=1 WHERE id IN (".implode(', ',$productIDs).")";
$result=mysql_query($query);
?>

Dat werkt uiteraard prima, maar nu wil een volgorde meegeven tijdens deze update actie. Nu dacht ik slim te zijn door gewoon de array key mee te geven zodat ik ze later op dezelfde volgorde kan uitlezen, maar... Hoe krijg ik in deze query bij elk individueel product ID de array key weggeschreven?

1
2
3
4
5
6
<?php
$productIDs 
array_values($_POST['assigned']);
$priority array_keys($_POST['assigned']);
$query "UPDATE products SET seasonAction=1, priority = ".en wat nu hier?." WHERE id IN (".implode(', ',$productIDs).")";
$result=mysql_query($query);
?>

Kortom, ik krijg een POST binnen met bv de volgende array

[code]
[0] => [338], [1] => [256], [2] => [479]

Dan wil ik dus bij alle 3 de productID's het veld seasonAction op 1 zetten en bij productID 338, priority op 0. Bij productID 256, priority op 1 en bij productID 479, priority op 2.

[ Bericht 2% gewijzigd door Swetsenegger op 16-12-2015 14:11:46 ]
pi_158282442
Voor zover ik weet dan dat alleen:
1) door meerdere UPDATE queries
2) één ingewikkelde query met CASE .. WHEN .. THEN, waarbij je een WHEN hebt voor elk product
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_158282479
quote:
5s.gif Op woensdag 16 december 2015 13:59 schreef Swetsenegger het volgende:
Ik loop even klem, ik denk dat ik een subquery moet gaan bouwen, maar even controleren met jullie :)

Ik heb een UPDATE query waarbij de WHERE clause een rijtje ID's is die uit een formulier submit komt:
[ code verwijderd ]

Dat werkt uiteraard prima, maar nu wil een volgorde meegeven tijdens deze update actie. Nu dacht ik slim te zijn door gewoon de array key mee te geven zodat ik ze later op dezelfde volgorde kan uitlezen, maar... Hoe krijg ik in deze query bij elk individueel product ID de array key weggeschreven?
[ code verwijderd ]

Dat kan niet in een enkele UPDATE. Dit is alleen mogelijk door de UPDATE voor iedere combinatie opnieuw uit te voeren via een foreach.

Het is wel via een andere constructie te doen maar dat lijkt me hier wat overkill.
Zie: http://stackoverflow.com/questions/3432/multiple-updates-in-mysql
Be curious, not judgmental
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 14:12:22 #174
1972 Swetsenegger
Egocentrische Narcist
pi_158282523
Hmz ja, dat dacht ik al. Das wel gezeik.
pi_158282752
En wat als de volgende post een bepaald product_id niet meer bevat en de waarde hiervan nog wel op 9 staat bijvoorbeeld? Of post je altijd alle producten?
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 14:24:25 #176
1972 Swetsenegger
Egocentrische Narcist
pi_158282848
quote:
19s.gif Op woensdag 16 december 2015 14:20 schreef TwenteFC het volgende:
En wat als de volgende post een bepaald product_id niet meer bevat en de waarde hiervan nog wel op 9 staat bijvoorbeeld? Of post je altijd alle producten?
Bij de verwerking van de post reset ik nu eerst alle seasonActions naar 0, daarna ga ik de nieuwe zetten.

Aan de voorkant haal ik alleen de combinatie op, dus alle producten waarbij seasonItem op 1 staat en dan wil ik ze dus op volgorde van priority tonen. Nu worden ze gewoon ascending op basis van product ID getoond.
pi_158283150
Ik zou een transactie bouwen en daarin alle benodigde queries uitvoeren.
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_158283224
quote:
14s.gif Op woensdag 16 december 2015 14:24 schreef Swetsenegger het volgende:

[..]

Bij de verwerking van de post reset ik nu eerst alle seasonActions naar 0, daarna ga ik de nieuwe zetten.

Aan de voorkant haal ik alleen de combinatie op, dus alle producten waarbij seasonItem op 1 staat en dan wil ik ze dus op volgorde van priority tonen. Nu worden ze gewoon ascending op basis van product ID getoond.
Krijgen deze seasonactions altijd een priority of hoeft dat niet? Dus het kan voorkomen dat je bijvoorbeeld gewoon 3 speciale producten per se bovenaan wilt zetten en de rest maakt niet?
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 14:46:22 #179
1972 Swetsenegger
Egocentrische Narcist
pi_158283377
quote:
19s.gif Op woensdag 16 december 2015 14:41 schreef TwenteFC het volgende:

[..]

Krijgen deze seasonactions altijd een priority of hoeft dat niet? Dus het kan voorkomen dat je bijvoorbeeld gewoon 3 speciale producten per se bovenaan wilt zetten en de rest maakt niet?
Allemaal die gepost worden.
pi_158283622
quote:
0s.gif Op woensdag 16 december 2015 14:46 schreef Swetsenegger het volgende:

[..]

Allemaal die gepost worden.
Oké dan zou ik het denk ik voor mezelf niet moeilijker maken dan het hoeft te zijn, en de sorteer volgorde gewoon in een aparte tabel gooien. en tijdens het ophalen van deze producten hier op sorteren.

Wat ook nog wel zou kunnen, wanneer je van te voren toch al van alles gaat updaten is de sorteervolgorde op 0 zetten voor alles en dmv een batch insert tijdens de ON DUPLICATE KEY enkel de sorteervolgorde en de seasonAction aanpassen.

Maar dit is wel wat gevaarlijk, mocht het product niet bestaan.
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 15:00:31 #181
1972 Swetsenegger
Egocentrische Narcist
pi_158283712
quote:
19s.gif Op woensdag 16 december 2015 14:57 schreef TwenteFC het volgende:

[..]

Oké dan zou ik het denk ik voor mezelf niet moeilijker maken dan het hoeft te zijn, en de sorteer volgorde gewoon in een aparte tabel gooien. en tijdens het ophalen van deze producten hier op sorteren.

Wat ook nog wel zou kunnen, wanneer je van te voren toch al van alles gaat updaten is de sorteervolgorde op 0 zetten voor alles en dmv een batch insert tijdens de ON DUPLICATE KEY enkel de sorteervolgorde en de seasonAction aanpassen.
Het zit er al in met een foreach. In plaats van 1 query heb ik nu natuurlijk de hoeveelheid queries van producten die gepost worden, maar heel spannend is het niet.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
//Set all previous items to NULL to disconnect from frontpage and priority. Then set new items
if($_SERVER['REQUEST_METHOD']=='POST' && isset($_POST['submitSeasonAction'])){
    
$query="UPDATE products SET seasonAction=0, priority=NULL";
    
$result=mysql_query($query);
    if(isset(
$_POST['assigned']) && count($_POST['assigned'])!=0){
        foreach (
$_POST['assigned'] as $key => $value) {
            
$key ++;
            
$query "UPDATE products SET seasonAction=1, priority=".$key." WHERE id=".$value;
            
$result=mysql_query($query);
        }
    }
    
header("location:".$_SERVER['PHP_SELF']."?actie=seizoensActie");
}
?>
pi_158283802
quote:
0s.gif Op woensdag 16 december 2015 15:00 schreef Swetsenegger het volgende:

[..]

Het zit er al in met een foreach. In plaats van 1 query heb ik nu natuurlijk de hoeveelheid queries van producten die gepost worden, maar heel spannend is het niet.
[ code verwijderd ]

:o Dan nog even iets anders, is dit een testprojectje of iets wat daadwerkelijk in productie gaat komen? Ik zou persoonlijk als ik jou was eens gaan kijken naar PDO/mysqli.
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 15:05:45 #183
1972 Swetsenegger
Egocentrische Narcist
pi_158283837
quote:
19s.gif Op woensdag 16 december 2015 15:04 schreef TwenteFC het volgende:

[..]

:o Dan nog even iets anders, is dit een testprojectje of iets wat daadwerkelijk in productie gaat komen? Ik zou persoonlijk als ik jou was eens gaan kijken naar PDO/mysqli.
Ja moet ik nog omzetten inderdaad!
pi_158283860
quote:
14s.gif Op woensdag 16 december 2015 15:05 schreef Swetsenegger het volgende:

[..]

Ja moet ik nog omzetten inderdaad!
En vergeten dat mysql_query bestaat :P
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 15:11:08 #185
1972 Swetsenegger
Egocentrische Narcist
pi_158283960
quote:
19s.gif Op woensdag 16 december 2015 15:06 schreef TwenteFC het volgende:

[..]

En vergeten dat mysql_query bestaat :P
De voorkant van deze site heb ik al omgezet naar mysqli :@
pi_158284068
quote:
0s.gif Op woensdag 16 december 2015 15:11 schreef Swetsenegger het volgende:

[..]

De voorkant van deze site heb ik al omgezet naar mysqli :@
Gebruik je composer? Je kan desnoods een package pakken welke een wrapper is hiervoor.

https://github.com/illuminate/database

Is misschien even een uurtje werk, maar vanaf dan hoef jij jezelf er ook niet meer druk om te maken. Naast deze zijn er ook genoeg anderen om uit te kiezen.

https://packagist.org/
pi_158285913
quote:
0s.gif Op woensdag 16 december 2015 15:11 schreef Swetsenegger het volgende:

[..]

De voorkant van deze site heb ik al omgezet naar mysqli :@
Als je toch bezig bent, waarom dan niet gewoon gelijk makkelijk doen en PDO gebruiken?
Edit: Of een ORM idd, ben zelf van de Doctrine.
Edit2: En herschrijven moet je sowieso want wat je hier aan code geplakt hebt zit barstensvol SQL injectie mogelijkheden.
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 17:09:00 #188
1972 Swetsenegger
Egocentrische Narcist
pi_158286843
quote:
14s.gif Op woensdag 16 december 2015 16:29 schreef KomtTijd... het volgende:

[..]

Als je toch bezig bent, waarom dan niet gewoon gelijk makkelijk doen en PDO gebruiken?
Edit: Of een ORM idd, ben zelf van de Doctrine.
Edit2: En herschrijven moet je sowieso want wat je hier aan code geplakt hebt zit barstensvol SQL injectie mogelijkheden.
Dit is backend waar 1 gebruiker toegang heeft.
pi_158286895
quote:
0s.gif Op woensdag 16 december 2015 17:09 schreef Swetsenegger het volgende:

[..]

Dit is backend waar 1 gebruiker toegang heeft.
:P Maar als je login/authenticatie script er ook zo uit ziet. Daarnaast ben jij jezelf nu ook aan het belemmeren wat betreft het updaten van jouw PHP versie in de toekomst, in PHP7 bijvoorbeeld bestaat de hele mysql_query niet meer.

Het zijn uiteindelijk maar goed bedoelde tips natuurlijk, wat en of je er iets mee gaat doen is aan jou.
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 17:13:23 #190
1972 Swetsenegger
Egocentrische Narcist
pi_158286909
quote:
19s.gif Op woensdag 16 december 2015 17:11 schreef TwenteFC het volgende:

[..]

:P Maar als je login/authenticatie script er ook zo uit ziet.
Nee dus :)

quote:
Daarnaast ben jij jezelf nu ook aan het belemmeren wat betreft het updaten van jouw PHP versie in de toekomst, in PHP7 bijvoorbeeld bestaat de hele mysql_query niet meer.

Het zijn uiteindelijk maar goed bedoelde tips natuurlijk, wat en of je er iets mee gaat doen is aan jou.
Ik ga het ook vervangen. Zoals gezegd is het grootste deel al klaar. Ik heb 4 back-end pagina's die ik moet aanpassen.
  FOK!-Schrikkelbaas woensdag 16 december 2015 @ 17:35:35 #191
1972 Swetsenegger
Egocentrische Narcist
pi_158287271
Dus geen zorgen jongens. Ik ben niet de beste programmeur, maar procedureel kan ik aardig uit de voeten.

Ik sanitize m'n input, ik preg match inkomende email adressen, ik intval als ik een integer verwacht, ik mysqli_real_escape_string inkomende vars, ik sla passwords gehashed en gesalt op....

Ik ben niet de beste programmeur, maar ik lees hier al een tijdje mee. Sterker nog.... Ik ben deze reeks begonnen :P



[ Bericht 7% gewijzigd door Swetsenegger op 16-12-2015 17:44:03 ]
  donderdag 17 december 2015 @ 17:52:19 #192
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_158311341
Garpig en revelant:

pi_158315321
quote:
0s.gif Op donderdag 17 december 2015 17:52 schreef Ser_Ciappelletto het volgende:
Garpig en revelant:

[ afbeelding ]
:D
  zondag 20 december 2015 @ 19:10:08 #194
230788 n8n
Pragmatisch
pi_158387309
php maakt onderscheid tussen strings in enkele en dubbele quotes. Kan je in een functie checken of een parameter met enkele of dubbele quotes is ingevoerd?

1
2
3
4
5
<?php
function quote($string){
  return 
'$string heeft X quotes'
}
?>

waar X ", of ' kan zijn
Specialization is for insects”.—Robert Heinlein
  Moderator / Redactie Sport zondag 20 december 2015 @ 19:24:29 #195
359864 crew  Nattekat
De roze zeekat
pi_158387613
quote:
14s.gif Op zondag 20 december 2015 19:10 schreef n8n het volgende:
php maakt onderscheid tussen strings in enkele en dubbele quotes. Kan je in een functie checken of een parameter met enkele of dubbele quotes is ingevoerd?
[ code verwijderd ]

waar X ", of ' kan zijn
Staan ze in de string zelf? Dan is het te achterhalen, anders niet (of er is een hele omslachtige manier waar ik geen weet van heb)
100.000 katjes
Maakte de 100.000e post in BIT
Er eens op uit?
pi_158387654
quote:
14s.gif Op zondag 20 december 2015 19:10 schreef n8n het volgende:
php maakt onderscheid tussen strings in enkele en dubbele quotes. Kan je in een functie checken of een parameter met enkele of dubbele quotes is ingevoerd?
[ code verwijderd ]

waar X ", of ' kan zijn
Ik begrijp niet helemaal wat je wilt.
Je wilt weten hoe $string was opgebouwd?
Be curious, not judgmental
  zondag 20 december 2015 @ 19:47:59 #197
12221 Tijn
Powered by MS Paint
pi_158388177
quote:
14s.gif Op zondag 20 december 2015 19:10 schreef n8n het volgende:

php maakt onderscheid tussen strings in enkele en dubbele quotes.
Volgens mij heeft PHP maar een string type. Of je zo'n string met enkele of dubbele quotes aanmaakt, heeft invloed op variabelen die in de string worden geparsed of niet, maar daarna wordt de string opgeslagen als het enige type string dat PHP kent.
  zondag 20 december 2015 @ 20:21:01 #198
230788 n8n
Pragmatisch
pi_158389121
quote:
0s.gif Op zondag 20 december 2015 19:24 schreef Nattekat het volgende:

[..]

Staan ze in de string zelf? Dan is het te achterhalen, anders niet (of er is een hele omslachtige manier waar ik geen weet van heb)
quote:
3s.gif Op zondag 20 december 2015 19:47 schreef Tijn het volgende:

[..]

Volgens mij heeft PHP maar een string type. Of je zo'n string met enkele of dubbele quotes aanmaakt, heeft invloed op variabelen die in de string worden geparsed of niet, maar daarna wordt de string opgeslagen als het enige type string dat PHP kent.
Ok duidelijk

v
quote:
7s.gif Op zondag 20 december 2015 19:26 schreef Aether het volgende:

[..]

Ik begrijp niet helemaal wat je wilt.
Je wilt weten hoe $string was opgebouwd?
Ik wilde weten of quote("string") of quote('string') werd aangeroepen.
Specialization is for insects”.—Robert Heinlein
  FOK!-Schrikkelbaas zondag 20 december 2015 @ 20:26:28 #199
1972 Swetsenegger
Egocentrische Narcist
pi_158389318
Wat probeer je precies op te lossen dan?
pi_158389403
quote:
14s.gif Op zondag 20 december 2015 20:21 schreef n8n het volgende:

[..]

[..]

Ok duidelijk

v

[..]

Ik wilde weten of quote("string") of quote('string') werd aangeroepen.
Dat kun je niet achterhalen.
De functie die aangeroepen wordt krijgt "een" string binnen en weet niet hoe of waar deze vandaan komt (bijvoorbeeld uit een database of bestand).
Be curious, not judgmental
  zondag 20 december 2015 @ 20:34:45 #201
230788 n8n
Pragmatisch
pi_158389596
quote:
5s.gif Op zondag 20 december 2015 20:26 schreef Swetsenegger het volgende:
Wat probeer je precies op te lossen dan?
ik wilde enkele quotes als key-name laten fungeren binnen de functie, en een dubbele quotes als string.

$value = ( 'string' ? $array['string'] : "string" ); kinda
Specialization is for insects”.—Robert Heinlein
  zondag 20 december 2015 @ 20:35:20 #202
230788 n8n
Pragmatisch
pi_158389616
quote:
7s.gif Op zondag 20 december 2015 20:29 schreef Aether het volgende:

[..]

Dat kun je niet achterhalen.
De functie die aangeroepen wordt krijgt "een" string binnen en weet niet hoe of waar deze vandaan komt (bijvoorbeeld uit een database of bestand).
Ja dacht ik al, net als dat je geen functie kan doorgeven maar alleen het resultaat. Helaas.
Specialization is for insects”.—Robert Heinlein
pi_158397080
quote:
7s.gif Op zondag 20 december 2015 20:35 schreef n8n het volgende:

[..]

Ja dacht ik al, net als dat je geen functie kan doorgeven maar alleen het resultaat. Helaas.
Niet helemaal waar, het is wel mogelijk om een functie door te geven aan een andere functie. Maar de manier waarop ziet er niet uit, en 't is geen mooie optie. Verder is er geen functie om te bepalen of een string als "string" of als 'string' gedefinieerd is. Er zit ook geen verschil in die definities, behalve bij het aanmaken van de string zelf.
  maandag 21 december 2015 @ 11:55:43 #204
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_158405576
Is er geen manier om daarvoor wat gewoonlijk een error zou zijn te gebruiken? Je invoerveld/script zodanig samenstellen met wat gewoonlijk een syntax-error zou geven, dat invoer met een " een bepaalde output geeft en invoer met een ' een andere.

Naïef voorbeeld dat allicht niet werkt om een idee te geven:
1
2
3
4
5
6
7
8
9
<script>
a = document.getElementById(id);
b = ' " ' + a + ' " ';
if (b) {
    //met enkele aanhalingstekens (want b = " ' value ' " --> geen error)
} else {
    // met dubbele aanhalingstekens (want b = " " value " " --> wel error)
}
</script>

It's not an error, it's a feature.
  maandag 21 december 2015 @ 12:11:53 #205
230788 n8n
Pragmatisch
pi_158405994
quote:
0s.gif Op maandag 21 december 2015 11:55 schreef Ser_Ciappelletto het volgende:
Is er geen manier om daarvoor wat gewoonlijk een error zou zijn te gebruiken? Je invoerveld/script zodanig samenstellen met wat gewoonlijk een syntax-error zou geven, dat invoer met een " een bepaalde output geeft en invoer met een ' een andere.

Naïef voorbeeld dat allicht niet werkt om een idee te geven:
[ code verwijderd ]

It's not an error, it's a feature.
dit is js lieverd (al ga ik deze functie later ook daarmee schrijven). Ik heb als 'hack' al geprobeerd een regex door te sturen maar ook dat moet als string. Ik zal zo even de functie neerplempen.

En light idd, call_user_func() is niet echt ideaal in mijn use-case.
Specialization is for insects”.—Robert Heinlein
  maandag 21 december 2015 @ 12:13:41 #206
308438 Ser_Ciappelletto
Semi-professionele SJW
pi_158406034
quote:
1s.gif Op maandag 21 december 2015 12:11 schreef n8n het volgende:

[..]

dit is js lieverd (al ga ik deze functie later ook daarmee schrijven). Ik heb als 'hack' al geprobeerd een regex door te sturen maar ook dat moet als string. Ik zal zo even de functie neerplempen.
Ja, ik weet dat het JS is, maar zoals gezegd werkt dat niet met PHP omdat die strings niet opslaat met de eigen aanhalingstekens. Je kunt dat altijd ajax-en.

Ik weet in ieder geval dat ik het al vaak genoeg verneukt heb door input met de verkeerde aanhalingstekens te bewerken, dus ik dacht: je kunt daar wellicht gebruik van maken.
  maandag 21 december 2015 @ 13:13:19 #207
230788 n8n
Pragmatisch
pi_158407729
Laat het echte probleem wel ff zien met de functie. Het gaat voornamelijk om el(), de andere zijn helper functies. html() is om een lijst van element uit te poepen, attribute om een attribute te maken, en find() om waarden uit de optionele $item te vinden.

De PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
// create elements from array
function el(array $element null$item null){
    
    foreach (
$element as $key => $value){
        if (
$key === 0){ $tag $value; } // set tag
        
elseif (is_numeric($key)){ // text content and/or html element
            
if (gettype($value) === 'string' || is_numeric($value)) $content.= $value;
            else 
$content.= el($value$data);
        }
        else 
$attributes.= attribute($key$value$item); // element attributes
    
}
    
    
// create html element and set attributes if any
    
if (!$attributes$result.= '<'.$tag.'>';
    else 
$result.= '<'.$tag.' '.trim($attributes).'>';    
    
    
// add contents if any and close element    
    
if ($content$result.= $content.'</'.$tag.'>';    
    return 
$result;    
}

// create element list from $data
function html(array $element, array $data null){

    if (!
$data$result.= el($element);    
    else foreach(
$data as $item){
        
$result.= el($element$item);
    }
    return 
$result;
}

// create element attribute
function attribute($name$value$item null){    
    if (
$value === true) return ' '.$name;    
    if (
gettype($value) === 'array'$value find($value$item);    
    if (
gettype($value) === 'string' || is_numeric($value)) {
        
$quote = (preg_match('/^\w+$/'$value) ? null '"');
        return 
' '.$name.'='.$quote.$value.$quote;
    }                        
}

// check for key in element $item array
function find($keys, array $item null){
    if (
$item && $match $item[$keys[0]]) return $match;
    elseif (
$item$keys[0] = null;
        
    foreach(
$keys as $key => $value){
        if (
$value) return $value;
    }
}
?>

De templating werkt met de data uit arrays.

Dit:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
// <header class=test><h1>Title</h1></header>
echo el(['header''class'=>'test',
    [
'h1'"Title"]
]);


// <p>Text</p>
echo el(['p'"Text"]);

// data for the next template
$pages = [
    [
'path'=>"one"'name'=>"Page One",'title'=>"A page" ],
    [
'path'=>"two"'name'=>"Page Two"'alt'=>"Another page" ]
];

// <ul><li><a href=one title="A Page">test</a><a href=two title="Another Page">test</a></li></ul>
echo el(['ul'html(['li',
    [
'a''href'=>['path'], 'title'=>['title'], "test" ]
], 
$pages)]);
?>

Wat ik wil is waar in de laatste plaats "test" staat, er ook een key van $pages ingevuld kan worden.

Sorry voor de enorme lap code

edit: simpelere voorbeelden, door te nesten kan je een hele DOM opbouwen.

[ Bericht 0% gewijzigd door n8n op 21-12-2015 16:31:09 ]
Specialization is for insects”.—Robert Heinlein
pi_158552849
quote:
7s.gif Op maandag 21 december 2015 13:13 schreef n8n het volgende:
Laat het echte probleem wel ff zien met de functie. Het gaat voornamelijk om el(), de andere zijn helper functies. html() is om een lijst van element uit te poepen, attribute om een attribute te maken, en find() om waarden uit de optionele $item te vinden.

De PHP
[ code verwijderd ]

De templating werkt met de data uit arrays.

Dit:
[ code verwijderd ]

Wat ik wil is waar in de laatste plaats "test" staat, er ook een key van $pages ingevuld kan worden.

Sorry voor de enorme lap code

edit: simpelere voorbeelden, door te nesten kan je een hele DOM opbouwen.
Het eerste dat me bij die code opvalt is dat de functie el() 2 optionele argumenten heeft, waarbij de eerste een array moet zijn als je 'm opgeeft en anders gewoon null is. Vervolgens gebruik je die parameter alsof het altijd een array is, dat gaat vroeg of laat fout.

Dus in plaats van
1
2
3
4
5
<?php
function el(array $element null$item null){

    foreach (
$element as $key => $value){
?>
zou ik kiezen voor
1
2
3
4
5
<?php
function el(array $element = array(), $item null){

    foreach (
$element as $key => $value){
?>
of voor
1
2
3
4
5
<?php
function el(array $element$item null){

    foreach (
$element as $key => $value){
?>

Verder is het niet duidelijk wat $item voor type moet/mag zijn.

En de functies attribute() en find() hebben niet altijd een return statement. Afhankelijk van wat er aan parameters in gaat, wordt er iets of niets geretourneerd. En je gebruikt op verschillende plekken variabelen die niet eerst geïnitialiseerd zijn. Niet direct fout, maar wel een potentieel risico. Een tikfout in een variabelenaam kan tot ongewenst of onverklaarbaar gedrag leiden, dus wil je bij voorkeur geen enkele notice zien.

Goed, nu eens kijken naar het probleem ;)
pi_158553692
quote:
7s.gif Op maandag 21 december 2015 13:13 schreef n8n het volgende:

Dit:
[ code verwijderd ]

Wat ik wil is waar in de laatste plaats "test" staat, er ook een key van $pages ingevuld kan worden.

Sorry voor de enorme lap code

edit: simpelere voorbeelden, door te nesten kan je een hele DOM opbouwen.
Je genereert invalid html, al bij het eerste voorbeeld.
1
2
3
4
5
6
<?php
// <header class=test><h1>Title</h1></header>
echo el(['header''class'=>'test',
    [
'h1'"Title"]
]);
?>

Bij valid html moeten attribute properties altijd in double quotes staan, dus wordt het
1<header class="test"><h1>Title</h1></header>

Ben je bekend met DOMDocument? Het kan handig zijn om dat te gebruiken, dat scheelt in ieder geval iets met rare dingen in html waar je rekening mee moet houden.
  zaterdag 26 december 2015 @ 23:52:54 #210
230788 n8n
Pragmatisch
pi_158555026
Bij enkele woorden zonder speciale karakters kan je de quotes weglaten maar dat is een implementatie-detail. Ga domdocument bekijken.

Zag gister dat m'n script op mithril (JS tempalting lijkt), geinig.
Specialization is for insects”.—Robert Heinlein
  zaterdag 26 december 2015 @ 23:57:29 #211
230788 n8n
Pragmatisch
pi_158555189
quote:
0s.gif Op zaterdag 26 december 2015 22:54 schreef Light het volgende:

[..]

Het eerste dat me bij die code opvalt is dat de functie el() 2 optionele argumenten heeft, waarbij de eerste een array moet zijn als je 'm opgeeft en anders gewoon null is. Vervolgens gebruik je die parameter alsof het altijd een array is, dat gaat vroeg of laat fout.

Dus in plaats van
[ code verwijderd ]

zou ik kiezen voor
[ code verwijderd ]

of voor
[ code verwijderd ]

Verder is het niet duidelijk wat $item voor type moet/mag zijn.

En de functies attribute() en find() hebben niet altijd een return statement. Afhankelijk van wat er aan parameters in gaat, wordt er iets of niets geretourneerd. En je gebruikt op verschillende plekken variabelen die niet eerst geïnitialiseerd zijn. Niet direct fout, maar wel een potentieel risico. Een tikfout in een variabelenaam kan tot ongewenst of onverklaarbaar gedrag leiden, dus wil je bij voorkeur geen enkele notice zien.

Goed, nu eens kijken naar het probleem ;)
ah dit is leerzaam, ga morgen even goed reageren.
Specialization is for insects”.—Robert Heinlein
pi_158556294
quote:
14s.gif Op zaterdag 26 december 2015 23:52 schreef n8n het volgende:
Bij enkele woorden zonder speciale karakters kan je de quotes weglaten maar dat is een implementatie-detail.
Altijd quotes gebruiken is makkelijker, dat scheelt ook in de code omdat je niet hoeft te bepalen of je ze wel of niet moet gebruiken. :)
  zondag 27 december 2015 @ 15:20:00 #213
230788 n8n
Pragmatisch
pi_158569470
quote:
0s.gif Op zondag 27 december 2015 00:26 schreef Light het volgende:

[..]

Altijd quotes gebruiken is makkelijker, dat scheelt ook in de code omdat je niet hoeft te bepalen of je ze wel of niet moet gebruiken. :)
Ja klopt, ik dacht als ik toch minified html uitpoep kan ik net zo goed quotes weglaten wanneer deze ‘obsolete’ zijn. Ik denk er nog even over na (het is ook maar 1 regel dus zo gewijzigd).

quote:
0s.gif Op zaterdag 26 december 2015 22:54 schreef Light het volgende:

[..]

Het eerste dat me bij die code opvalt is dat de functie el() 2 optionele argumenten heeft, waarbij de eerste een array moet zijn als je 'm opgeeft en anders gewoon null is. Vervolgens gebruik je die parameter alsof het altijd een array is, dat gaat vroeg of laat fout.

Dus in plaats van
[ code verwijderd ]

zou ik kiezen voor
[ code verwijderd ]

of voor
[ code verwijderd ]

Ik ben voor de tweede gegaan, een lege array is niet de bedoeling.

quote:
Verder is het niet duidelijk wat $item voor type moet/mag zijn.
Dat moet ook een array zijn, bij html() kan daar een array met $item's in om een nodelist te renderen, in el() is $item een data rij met named keys waar content in zit. Dit is waar het hele probleem om draait, want het lukt niet om onderscheid te maken tussen een html ‘nodelist’ array of de naam van een key in $item.
quote:
En de functies attribute() en find() hebben niet altijd een return statement. Afhankelijk van wat er aan parameters in gaat, wordt er iets of niets geretourneerd.
Klopt, dat is nu een silent error omdat ik niet wilde dat wanneer niks gevonden werd er een error kwam, maar een element simpelweg leeg zou zijn. Ik zal een return null toevoegen.
quote:
En je gebruikt op verschillende plekken variabelen die niet eerst geïnitialiseerd zijn.
Hoe bedoel je?
quote:
Niet direct fout, maar wel een potentieel risico. Een tikfout in een variabelenaam kan tot ongewenst of onverklaarbaar gedrag leiden, dus wil je bij voorkeur geen enkele notice zien.

Goed, nu eens kijken naar het probleem ;)
Ik ga de eerste batch fixes vast patchen. dankjewel!
Specialization is for insects”.—Robert Heinlein
pi_158571131
quote:
7s.gif Op zondag 27 december 2015 15:20 schreef n8n het volgende:

[..]

Hoe bedoel je?

[..]

Ik ga de eerste batch fixes vast patchen. dankjewel!
Als voorbeeld de foreach loop in de el() functie.
1
2
3
4
5
6
7
8
9
10
<?php
    
foreach ($element as $key => $value){
        if (
$key === 0){ $tag $value; } // set tag
        
elseif (is_numeric($key)){ // text content and/or html element
            
if (gettype($value) === 'string' || is_numeric($value)) $content.= $value;
            else 
$content.= el($value$data);
        }
        else 
$attributes.= attribute($key$value$item); // element attributes
    
}
?>

Je gebruikt daar
1
2
3
<?php
$content 
.= $value;
?>
maar zeker bij de eerste loop bestaat $content nog helemaal niet. Dat kun je voorkomen door voor de loop, dus aan het begin van de functie, $content = ''; te zetten en zo te zorgen dat $content bestaat (en als inhoud een lege string heeft, ook logisch bij string concatenation). Voor $attributes geldt hetzelfde.

En waar $data vandaan komt in "else $content.= el($value, $data);" weet ik niet, maar die heeft ook geen waarde.

Verder kun je
1
2
3
4
<?php
    
if (!$attributes$result.= '<'.$tag.'>';
    else 
$result.= '<'.$tag.' '.trim($attributes).'>';
?>
vervangen door
1
2
3
4
<?php
    
if (!$attributes$result '<'.$tag.'>';
    else 
$result '<'.$tag.' '.trim($attributes).'>';
?>
waarbij je dus geen string concatenation meer gebruikt maar de variabele $result hier gewoon een waarde krijgt.
  zondag 27 december 2015 @ 18:51:13 #215
230788 n8n
Pragmatisch
pi_158576066
Zal dat nog even aanpassen, die concatenation was nog legacy van een probeersel, scherp.
Specialization is for insects”.—Robert Heinlein
pi_158576461
quote:
14s.gif Op zondag 27 december 2015 18:51 schreef n8n het volgende:
Zal dat nog even aanpassen, die concatenation was nog legacy van een probeersel, scherp.
Een IDE die zulke dingen aangeeft, helpt ook. ;)
  zondag 27 december 2015 @ 19:58:27 #217
230788 n8n
Pragmatisch
pi_158577974
quote:
1s.gif Op zondag 27 december 2015 19:07 schreef Light het volgende:

[..]

Een IDE die zulke dingen aangeeft, helpt ook. ;)
Light.app :@ bedankt voor je feedback, een IDE is nog even een brug te ver, schrijf meestal JS.

[ Bericht 5% gewijzigd door n8n op 28-12-2015 13:18:19 ]
Specialization is for insects”.—Robert Heinlein
  dinsdag 29 december 2015 @ 22:01:44 #218
37634 wobbel
Da WoBBeL King
pi_158651842
Help, klopt dit zo? Het testen duurt iets te lang :P Script draait elke minuut via crontab :)

Het script moet de GPIO op 1 zetten als de zon is ondergegaan en de GPIO nog geen 1 is.
Het script moet ook de GPIO op 0 zetten als de zon is opgekomen en dit nog niet gebeurd is.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
<?php
$bcm_pin                            
4;

$huidige_tijd                        date "U" );
$opkomst                            date_sunrise time ( ), SUNFUNCS_RET_TIMESTAMP );
$ondergang                            date_sunset time ( ), SUNFUNCS_RET_TIMESTAMP );

if ( 
$huidige_tijd $opkomst AND $huidige_tijd $ondergang )
{
    
    
system                            ("gpio -g mode " $bcm_pin " out");
    
$huidig                            exec ("gpio -g read " $bcm_pin );
    
    if ( 
$huidig == "1" )
    {
    
        
system                        ("gpio -g write " $bcm_pin " 0" );
        
        echo                        
"Zon opgekomen en status nog 1, op 0 gezet :-)";
        
    }
    else
    {
        
        echo                        
"Het is licht en de lamp is al uit";    
        
    }
    
}
else
{

    
system                            ("gpio -g mode " $bcm_pin " out");
    
$huidig                            exec ("gpio -g read " $bcm_pin );
    
    if ( 
$huidig == "0" )
    {
    
        
system                        ("gpio -g write " $bcm_pin " 1" );
        
        echo                        
"Zon ondergegaan en status nog 0, op 1 gezet :-)";
        
    }
    else
    {
        
        echo                        
"Het is donker maar de lamp is al aan";    
        
    }
    
}
?>
pi_158652450
quote:
17s.gif Op zondag 27 december 2015 19:58 schreef n8n het volgende:

[..]

Light.app :@ bedankt voor je feedback, een IDE is nog even een brug te ver, schrijf meestal JS.
Ook daarvoor is een IDE geen overkill hoor, zeker als je ook nog wat frameworks oid gebruikt. Kijk bijvoorbeeld eens naar Webstorm:
https://www.jetbrains.com/webstorm/
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_158667753
quote:
0s.gif Op dinsdag 29 december 2015 22:01 schreef wobbel het volgende:
Help, klopt dit zo? Het testen duurt iets te lang :P Script draait elke minuut via crontab :)

Het script moet de GPIO op 1 zetten als de zon is ondergegaan en de GPIO nog geen 1 is.
Het script moet ook de GPIO op 0 zetten als de zon is opgekomen en dit nog niet gebeurd is.
[ code verwijderd ]

Lijkt leuk (afgezien van de overvloed aan spaties) maar ik zou 't script niet afhankelijk maken van de standaardwaarden voor lengte- en breedtegraad. Die zijn bij een standaardinstallatie niet eens in de buurt van je huidige locatie.
  woensdag 30 december 2015 @ 18:55:22 #221
37634 wobbel
Da WoBBeL King
pi_158682115
quote:
0s.gif Op woensdag 30 december 2015 12:26 schreef Light het volgende:

[..]

Lijkt leuk (afgezien van de overvloed aan spaties) maar ik zou 't script niet afhankelijk maken van de standaardwaarden voor lengte- en breedtegraad. Die zijn bij een standaardinstallatie niet eens in de buurt van je huidige locatie.
Ja wel, het is een raspberry in m'n meterkast waar ik de timezone (en lat/long) netjes heb ingevuld :)
pi_159008554
There Will Be Many Features Coming For PHP 7.1
PHP 7 was just released over one month ago but there is already much work going into PHP 7.1, the next major update to this widely-used web programming language.

PHP 7.0 is most notable for the huge performance improvements compared to PHP5 and some new language features. With PHP 7.1, there are more features coming for when it's released later this year.

For some weekend reading, I was poking around for a look at some PHP 7.1 features already committed as well as some other likely material.

The tentative news items for work already found in PHP Git includes:

• PHP 7.1 adds support for a void return type.
• SHA3 fixed mode algorithms were added.
• The bundled SQLite library is updated against 3.9.2 rather than 3.8.
• Various bug fixes and other minor improvements.

Other items being planned and/or talked about for PHP 7.1 include:

• PHP Cryptography Objects (PCO) for better encryption/decryption/signing.
Short closures.
Generic types and functions.
• HTTP/2 and server push support.

Other proposals for future releases of PHP (not necessarily PHP 7.1) can be found via the RFC Wiki area. Stay tuned for more coverage of PHP 7.1 as its release approaches later in the year.
Be curious, not judgmental
  maandag 18 januari 2016 @ 18:27:45 #223
272287 henrivo
Tikt tegen jassies
pi_159207065
Hoi! Zomaar even een vraagje, puur uit interesse;
Zelf gebruik ik tijdens het programmeren engelse variabelennamen en nederlands commentaar. Welke taal geef jij zelf de voorkeur en waarom? :)
  maandag 18 januari 2016 @ 18:47:27 #224
12221 Tijn
Powered by MS Paint
pi_159207571
Alles Engels, want je wet nooit met wie je je code later nog wil delen.
pi_159207639
quote:
3s.gif Op maandag 18 januari 2016 18:47 schreef Tijn het volgende:
Alles Engels, want je wet nooit met wie je je code later nog wil delen.
Dat was ik inderdaad ook altijd gewend en bovendien werkte ik bij voorgaande werkgevers ook vaak met mensen die de Nederlandse taal niet beheersten. Bij mijn huidige werkgever is het vrij irritant dat de helft van de domeinspecifieke terminologie in het Nederlands is en dat in veel projecten ook in de code is doorgevoerd.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_159207818
quote:
3s.gif Op maandag 18 januari 2016 18:47 schreef Tijn het volgende:
Alles Engels, want je wet nooit met wie je je code later nog wil delen.
Dit.

En iedere Nederlander kan wel Engels lezen.
pi_159207885
Wat gaat Symfony 3.0 snel met versienummers zeg. :o
  maandag 18 januari 2016 @ 19:00:40 #228
272287 henrivo
Tikt tegen jassies
pi_159207952
quote:
1s.gif Op maandag 18 januari 2016 18:58 schreef robin007bond het volgende:
Wat gaat Symfony 3.0 snel met versienummers zeg. :o
Ik kwam in de documentatie al 3.1 tegen idd, voorlopig blijf ik wel bij 2.8.2 :+
pi_159208127
Ik zit nog op 2.7.*. In 2.8 is er echt ineens van alles deprecated dat ik heb gebruikt en de LTS-support loopt nog voorlopig. :P
  maandag 18 januari 2016 @ 19:11:39 #230
272287 henrivo
Tikt tegen jassies
pi_159208256
quote:
1s.gif Op maandag 18 januari 2016 18:58 schreef robin007bond het volgende:
Wat gaat Symfony 3.0 snel met versienummers zeg. :o
Misschien handig voor de collega-symfony-developers :)

pi_159208539
quote:
7s.gif Op maandag 11 januari 2016 11:43 schreef Aether het volgende:
There Will Be Many Features Coming For PHP 7.1
PHP 7 was just released over one month ago but there is already much work going into PHP 7.1, the next major update to this widely-used web programming language.

• PHP Cryptography Objects (PCO) for better encryption/decryption/signing.
Short closures.
Generic types and functions.
• HTTP/2 and server push support.

Other proposals for future releases of PHP (not necessarily PHP 7.1) can be found via the RFC Wiki area. Stay tuned for more coverage of PHP 7.1 as its release approaches later in the year.
Leuk, maar die short closures komen er niet.
pi_159212641
quote:
0s.gif Op maandag 18 januari 2016 19:20 schreef Light het volgende:

[..]

Leuk, maar die short closures komen er niet.
Erg onoverzichtelijk ook, had anders sowieso liever wat meer getypt om het leesbaar te houden.
  maandag 18 januari 2016 @ 21:20:14 #233
91039 mstx
2x1/2 = 1/2 x 1/2
pi_159213158
quote:
0s.gif Op maandag 18 januari 2016 19:20 schreef Light het volgende:

[..]

Leuk, maar die short closures komen er niet.
Ach, zoals op die pagina ook al staat komt het er (mogelijk) wel in maar dan in een net iets andere syntax.
Op donderdag 2 juli 2009 22:41 schreef RTB het volgende:
als ik elk rap"liedje" een kans moest geven was ik aan het eind van dit millennium nog bezig met het tempo waarin die kotshoop uitgebraakt wordt.
👾
pi_159478653
(PHP 7.0.1) Fixed bug #70831 (Compile fails on system with 160 CPUs).

Had er al last van op mijn dev omgeving.
pi_159488618
Wel stoer dat er blijkbaar gewoon ergens iemand is, met een 160 core rig die daar PHP op wil draaien.
  zondag 31 januari 2016 @ 14:19:39 #236
272287 henrivo
Tikt tegen jassies
pi_159540367
Hey guys! Even een vraagje voor de mensen die werken met Symfony(2/3).

Ik heb onlangs een UploadBundle gemaakt, so far so good. Voor single files. Nu wil ik echter de mogelijkheid om _meerdere_ files tegelijk te uploaden, en dat lijkt in de praktijk net een stuk lastiger te zijn. Mijn vraag is, voor degenen die eerder in deze situatie hebben gezeten, hebben jullie tips of advies mbt de Entity/Controller? Ik loop hier nu op vast en de officiële documentatie is gebaseerd op het uploaden van _single_ files.

Bedankt alvast! :)
  woensdag 3 februari 2016 @ 10:50:05 #237
403866 richolio
#MacMasterrace
pi_159616963
Hallo,

Ik werk met ExpressionEngine, maar heb voor deze even PHP aangezet in mijn template. De URL is hoofdlettergevoelig, en die case sensitivity is nou net niet wat ik wil. Ik heb 6 segments, en als {segment_5} bijvoorbeeld "Rotterdam" is, dan doet "rotterdam" het niet. Nja, goed, hoofdlettergevoelig dus.

Het internet heeft niet geholpen. Misschien iemand hier die wat weet?
'Richolio _O_' - tong80
LAST.FM
pi_159631338
quote:
1s.gif Op zondag 31 januari 2016 14:19 schreef henrivo het volgende:
Hey guys! Even een vraagje voor de mensen die werken met Symfony(2/3).

Ik heb onlangs een UploadBundle gemaakt, so far so good. Voor single files. Nu wil ik echter de mogelijkheid om _meerdere_ files tegelijk te uploaden, en dat lijkt in de praktijk net een stuk lastiger te zijn. Mijn vraag is, voor degenen die eerder in deze situatie hebben gezeten, hebben jullie tips of advies mbt de Entity/Controller? Ik loop hier nu op vast en de officiële documentatie is gebaseerd op het uploaden van _single_ files.

Bedankt alvast! :)
https://stackoverflow.com(...)upload-with-symfony2

Heb je hier wat aan?
pi_159631506
quote:
11s.gif Op woensdag 3 februari 2016 10:50 schreef richolio het volgende:
Hallo,

Ik werk met ExpressionEngine, maar heb voor deze even PHP aangezet in mijn template. De URL is hoofdlettergevoelig, en die case sensitivity is nou net niet wat ik wil. Ik heb 6 segments, en als {segment_5} bijvoorbeeld "Rotterdam" is, dan doet "rotterdam" het niet. Nja, goed, hoofdlettergevoelig dus.

Het internet heeft niet geholpen. Misschien iemand hier die wat weet?
Wat?
pi_159640874
PHP is een smerige taal. Dat moest ik toch nog even kwijt.
  donderdag 4 februari 2016 @ 09:26:09 #241
403866 richolio
#MacMasterrace
pi_159643883
quote:
15s.gif Op woensdag 3 februari 2016 20:21 schreef KomtTijd... het volgende:

[..]

Wat?
Laat maar
'Richolio _O_' - tong80
LAST.FM
  donderdag 4 februari 2016 @ 09:26:59 #242
403866 richolio
#MacMasterrace
pi_159643892
Ik had een PHP oplossing nodig tegen hoofdlettergevoeligheid in de URL.

Maar gefixt, niet echt via php ofzo, maar goed.
'Richolio _O_' - tong80
LAST.FM
  donderdag 4 februari 2016 @ 18:42:55 #243
272287 henrivo
Tikt tegen jassies
pi_159657517
quote:
Ik had er misschien iets aan als ik em zelf niet was tegengekomen :P

Ik dacht een workaround te hebben gevonden maar blijf tegen dit probleem aanlopen:

1The class 'Symfony\Component\HttpFoundation\File\UploadedFile' was not found in the chain configured namespaces UserBundle\Entity, BlogBundle\Entity, 

Heb maar besloten om even een paar dagen niet naar de code te kijken :)
  † In Memoriam † donderdag 4 februari 2016 @ 22:32:45 #244
159335 Boze_Appel
Vrij Fruit
pi_159666819
quote:
9s.gif Op donderdag 4 februari 2016 00:05 schreef robin007bond het volgende:
PHP is een smerige taal. Dat moest ik toch nog even kwijt.
Waarvan akte.
Carpe Libertatem
  † In Memoriam † donderdag 4 februari 2016 @ 22:38:28 #245
159335 Boze_Appel
Vrij Fruit
pi_159667126
quote:
1s.gif Op zondag 31 januari 2016 14:19 schreef henrivo het volgende:
Hey guys! Even een vraagje voor de mensen die werken met Symfony(2/3).

Ik heb onlangs een UploadBundle gemaakt, so far so good. Voor single files. Nu wil ik echter de mogelijkheid om _meerdere_ files tegelijk te uploaden, en dat lijkt in de praktijk net een stuk lastiger te zijn. Mijn vraag is, voor degenen die eerder in deze situatie hebben gezeten, hebben jullie tips of advies mbt de Entity/Controller? Ik loop hier nu op vast en de officiële documentatie is gebaseerd op het uploaden van _single_ files.

Bedankt alvast! :)
Ongeacht symfony zou ik sowieso de ontvanger niet meerdere files tegelijk laten opvangen, maar gewoon 1 route die 1 bestand ontvangt en dat verwerkt. Hetzij direct, of beter, in een queue/worker. Laat de voorkant dan maar lekker bestanden er in pompen.
Carpe Libertatem
  † In Memoriam † donderdag 4 februari 2016 @ 22:40:47 #246
159335 Boze_Appel
Vrij Fruit
pi_159667203
Overigens ben ik echt dolgelukkig met de snelheid en verbeterde opcache van php7. Phars als Composer speren nu echt als een malle.
Carpe Libertatem
pi_159970855
Hey peepz, ik heb weer wat raars.

Ik heb een pagina waarbij ik een afbeelding wil uitspugen met php, daarbij krijg ik de volgende headers
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Host: 127.0.0.1
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Encoding: gzip, deflate, sdch
Accept-Language: nl-NL,nl;q=0.8,en-US;q=0.6,en;q=0.4
Cookie: PHPSESSID=u0gn1n80b3v6ipkbstoi0fct41
DNT: 1
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/48.0.2564.109 Safari/537.36
X-CookiesOK: I explicitly accept all cookies

HTTP/1.1 200 OK
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Connection: Keep-Alive
Content-Type: image/png
Date: Tue, 16 Feb 2016 18:16:18 GMT
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Keep-Alive: timeout=5, max=100
Pragma: no-cache
Server: Apache/2.4.6 (Win32) PHP/5.4.17
Transfer-Encoding: chunked
X-Powered-By: PHP/5.4.17

Het stukje PHP code is
1
2
3
4
5
6
7
8
9
10
11
12
<?php
            $fp 
fopen($foto_origineel'rb');
            
header("Cache-Control: no-cache, must-revalidate"); 
            
header("Pragma: no-cache"); //keeps ie happy
            
header('Content-Transfer-Encoding: binary');
            
header("Content-type: " $headertype);
            
header('Content-Length: ' filesize($foto_origineel));
            
ob_end_clean();//required here or large files will not work
            
fpassthru($fp);
            
fclose($fp);
            exit;
?>
Echter zie ik geen afbeelding, helemaal niets zelfs... iemand een idee? Bestand bestaat in een andere functie waarbij ik een thumbnail aanmaak zie ik zelfs de thumbnail niet... geen plaatjes zichtbaar op wat voor manier dan ook (als ik PHP het laat uitspugen/genereren)
Just say hi!
pi_159970915
En weet iemand hoe ik gemakkelijk USBWEBSERVER van een nieuwe versie van PHP kan voorzien? zit nu met versie 5.2.nogwat maar wil graag ietsje hoger ivm password_hash functie...
Just say hi!
pi_159972675
quote:
0s.gif Op dinsdag 16 februari 2016 19:21 schreef Chandler het volgende:
En weet iemand hoe ik gemakkelijk USBWEBSERVER van een nieuwe versie van PHP kan voorzien? zit nu met versie 5.2.nogwat maar wil graag ietsje hoger ivm password_hash functie...
De PHP binary + dll's vervangen? :P

[ Bericht 0% gewijzigd door #ANONIEM op 16-02-2016 20:10:34 ]
pi_159984134
Dank robin007bond, ik ga het proberen! :)

En niemand een andere oplossing voor mijn probleem? zie niets raars aan de headers! :)

-edit-
Ik had al zo'n gevoel dat er een BOM in mijn bestanden moest zitten en ja hoor, 1 van mijn php bestanden bevatte BOM... nu werkt alles naar behoren! :)

[ Bericht 29% gewijzigd door Chandler op 17-02-2016 09:20:00 ]
Just say hi!
  woensdag 17 februari 2016 @ 13:13:28 #251
25889 Sitethief
Fulltime Flapdrol
pi_159989436
quote:
0s.gif Op woensdag 17 februari 2016 08:34 schreef Chandler het volgende:
Dank robin007bond, ik ga het proberen! :)

En niemand een andere oplossing voor mijn probleem? zie niets raars aan de headers! :)

-edit-
Ik had al zo'n gevoel dat er een BOM in mijn bestanden moest zitten en ja hoor, 1 van mijn php bestanden bevatte BOM... nu werkt alles naar behoren! :)
quote:
Many older text editors always inject a trailing newline. And trailing whitespace led to "headers already sent" errors. The PHP interpreter actually circumvents this problem, and eats up a SINGLE trailing \r and \n newline after the ?> closing tag. Some unpracticed programmers however errornously added two or more trailing newlines or spaces, tabs after ?>. That's why it's considered good newbie guidance to omit the PHP close marker. It's however not indicative of good coding style.
Ik laat ze altijd weg als ik met headers e.d. werk, dan kan dat iig nooit gebeuren.
Stroek: Sitethief, die is heel groot en sterk :Y.
Faat: *zucht* zoals gewoonlijk hoor Sitethief weer in de bocht &gt;:)
pi_159989912
Ik laat ze sowieso altijd weg. Waarom zou je sluittags plaatsen die geen enkel nut hebben en mogelijk wel problemen veroorzaken?
pi_159991308
quote:
14s.gif Op woensdag 17 februari 2016 13:34 schreef KomtTijd... het volgende:
Ik laat ze sowieso altijd weg. Waarom zou je sluittags plaatsen die geen enkel nut hebben en mogelijk wel problemen veroorzaken?
Dit. Gewoon standaard UTF-8. Geen gezeik.

Oh ja, en fuck sluittags.

[ Bericht 3% gewijzigd door #ANONIEM op 17-02-2016 18:40:31 ]
pi_159991887
quote:
14s.gif Op woensdag 17 februari 2016 13:34 schreef KomtTijd... het volgende:
Ik laat ze sowieso altijd weg. Waarom zou je sluittags plaatsen die geen enkel nut hebben en mogelijk wel problemen veroorzaken?
omdat het voor sommige mensen nooit problemen zal veroorzaken, waardoor het dus puur een esthetische afweging wordt. vooral als je richting ocd neigt is het irritant als html en php vol met open+sluiten zit en er vervolgens geheel overbodig een uitzondering wordt gemaakt :P
..///
pi_159996742
Sluit tags gebruik ik alleen bij inline HTML code, hier heb ik ze er gewoon bij geplaatst :D
Just say hi!
pi_160207375
Hoi, ik heb een probleempje. Ik probeer een base64 van een png naar de Imgur-API te sturen, maar ik krijg een foutmelding terug: "Image failed to upload." met code 400.
quote:
Status Code: 400
This error indicates that a required parameter is missing or a parameter has a value that is out of bounds or otherwise incorrect. This status code is also returned when image uploads fail due to images that are corrupt or do not meet the format requirements.
Het gaat om de volgende code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
<?php
$client_id 
"2bc14449";

$search = array('/''+''=');
$replace= array('%2F''%2B''%3D');

$imgtest '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';
$imgconv str_replace($search$replace$imgtest);

echo 
"$imgtest<br>";
echo 
$imgconv;

$data = array(
    
'image' => $imgconv,
    
'type'     => 'base64'
);

$ch curl_init();
curl_setopt($chCURLOPT_URL'https://api.imgur.com/3/image.json');
curl_setopt($chCURLOPT_POSTTRUE);
curl_setopt($chCURLOPT_RETURNTRANSFERTRUE);
curl_setopt($chCURLOPT_HTTPHEADER, array('Authorization: Client-ID ' $client_id ));
curl_setopt($chCURLOPT_POSTFIELDShttp_build_query($data));

$reply curl_exec($ch);

curl_close($ch);

$reply json_decode($reply);

echo 
"<h3>API Debug</h3><pre>";
var_dump($reply);
?>

Zien jullie het probleem? Ik vermoed zelf dat ik iets niet goed doe met de CURLOPT_POSTFIELDS, maar dat weet ik niet zeker. Zowel $imgtest als $imgconv zijn juist.

[ Bericht 0% gewijzigd door #ANONIEM op 25-02-2016 17:46:20 ]
pi_160208686
Wat heb je zelf al getest? Werkt je request met dezelfde data wel als je een api-tester gebruikt?
pi_160209428
quote:
14s.gif Op donderdag 25 februari 2016 18:30 schreef KomtTijd... het volgende:
Wat heb je zelf al getest? Werkt je request met dezelfde data wel als je een api-tester gebruikt?
Heb even snel gekeken, maar ik krijg een foutmelding door de manier waarop ik de client_id erin zet, maar zodra ik thuis ben kan ik het beter testen.
pi_160220876
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php
$imgtest 
'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';
$pvars       = array('image' => $imgtest'type' => 'base64');
$timeout     30;

$curl curl_init();
curl_setopt($curlCURLOPT_URL'https://api.imgur.com/3/image.json');
curl_setopt($curlCURLOPT_TIMEOUT$timeout);
curl_setopt($curlCURLOPT_HTTPHEADER, array('Authorization: Client-ID ' $client_id));
curl_setopt($curlCURLOPT_POST1);
curl_setopt($curlCURLOPT_RETURNTRANSFER1);
curl_setopt($curlCURLOPT_POSTFIELDS$pvars);
$out curl_exec($curl);
curl_close ($curl);

$output json_decode($out,true);
$url=$output['data']['link'];
if(
$url!=""){
   echo 
"<img src='$url'/><br/>$url";
  }else{
    echo 
'Nope, errorrrr; '.$output['data']['error'];  
  }
?>

Opgelost met dank aan BBQSausage.
pi_160667514
Vraagje over opzet site.

Zelf ben ik bezig met een nieuwe site, daarvoor heb ik nu een simpel rechten systeem gebruikt waarbij ik in de database aangeef of het om een 'gast', 'gebruiker', 'moderator' of admin gaat

Op zich werkt dit goed, alleen naar mate de site gaat groeien wil ik mogelijk meerdere onderdelen beperken voor bepaalde gebruikers (gebruikers/moderators).

Nu vind ik het implementeren van ACL best een heel werk en aangezien er maar een paar delen van de site beperkingen nodig hebben is het gebruik van ACL dus imho iets te veel van het goede, is bitwise dan wel een juiste methode? daar kan ik maar maximaal 64 rechten specificeren (BIGINT in de database) of hebben jullie andere suggesties?
Just say hi!
pi_160674195
Bitvelden zou ik per definitie met een zo groot mogelijke boog omheen werken, tenzij je écht niet anders kan (maar gezien dit het PHP topic is lijkt me niet dat je op een microcontroller met een paar kB geheugen zit).

Wat ik zelf een handige structuur vindt:
- gebuikers kunnen tot 1 of meerdere groepen behoren
- groepen kunnen verschillende rechten hebben

Op die manier hoef je niet per user tig vinkjes door te werken maar heb je wel alle flexibiliteit om iedereen precies de juiste rechten te geven, door een gebruiker aan een combinatie van groepen te hangen.
pi_160677773
quote:
14s.gif Op maandag 14 maart 2016 22:58 schreef KomtTijd... het volgende:
Bitvelden zou ik per definitie met een zo groot mogelijke boog omheen werken, tenzij je écht niet anders kan (maar gezien dit het PHP topic is lijkt me niet dat je op een microcontroller met een paar kB geheugen zit).

Wat ik zelf een handige structuur vindt:
- gebuikers kunnen tot 1 of meerdere groepen behoren
- groepen kunnen verschillende rechten hebben

Op die manier hoef je niet per user tig vinkjes door te werken maar heb je wel alle flexibiliteit om iedereen precies de juiste rechten te geven, door een gebruiker aan een combinatie van groepen te hangen.
Dus doel je op het gebruiken van ACL. Op zich niet een groot probleem om in te bouwen hoor, alleen zit veel meer werk aan dan een simpeler rechten systeem En vroeg mij af of er niet meer soorten rechten systemen zijn... oh en met bitwise hoef ik in de database per gebruiker maar 1 'getal' in te voeren die daarmee gelijk alle rechten aan de gebruiker geeft.
Just say hi!
pi_160680790
Geloof me, dat klinkt nu heel makkelijk, maar als je over een half jaar een gebruiker wilt toevoegen zit je je hele applicatie door te spitten naar dat stukje code waaruit je kunt opmaken welke rechten ook al weer bij welk bitmask hoorde. En je applicatie overdragen aan een andere developer kun je helemaal wel vergeten.

Als relaties aanleggen in je relationele DB echt te moeilijk is, zou ik nog eerder de voorkeur geven aan comma seperated groepsnamen opslaan oid.
pi_160681114
Ja ik heb een applicatie draaien die moet communiceren met een database waarvan de ontwikkelaar het ook nodig vond om overal bitfields voor te gebruiken. Het zit me hoog.
pi_160689034
Zó ingewikkeld is het maken van een ACL toch ook weer niet.

(Nou ja, ik weet niet wat de prestaties zijn van wat ik heb gemaakt als je miljoenen diep in elkaar geneste objecten hebt...)
pi_160689137
quote:
0s.gif Op dinsdag 15 maart 2016 18:43 schreef Igen het volgende:
Zó ingewikkeld is het maken van een ACL toch ook weer niet.

(Nou ja, ik weet niet wat de prestaties zijn van wat ik heb gemaakt als je miljoenen diep in elkaar geneste objecten hebt...)
Ik zit er al een tijdje niet meer in, maar een beetje PHP framework heeft toch wel gewoon standaard een ACL-achtig systeem?
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_160689216
quote:
1s.gif Op dinsdag 15 maart 2016 18:48 schreef Monolith het volgende:

[..]

Ik zit er al een tijdje niet meer in, maar een beetje PHP framework heeft toch wel gewoon standaard een ACL-achtig systeem?
Vast wel. Nou weet ik niet wat Chandler wil maar misschien kan die ook wel gewoon WordPress gebruiken o.i.d. :+
pi_160697741
Haha, ik heb zelf al eerder ACL gebruikt voor een soort gelijk project waarbij vele groepen zaten waar leden lid van konden worden, daar was het erg handig voor. Echter heeft dit project maar een paar onderdelen waarbij de gebruikers rechten nodig hebben (of eerder gezegd specifieke rechten).
Maar goed, ik denk dat ik dan toch maar voor ACL ga, heb de classes al liggen dus kan deze zo hergebruiken maar vind het altijd een kriem om het in de admin in te bouwen... Maar goed, weer wat extra's te doen :P
Just say hi!
pi_160869074
ACL is ingebouwd, werkt idd toch wat handiger als de site gaat groeien.

Andere vraag, ik heb 3 queries, maar alleen de eerste wordt verwerkt, de andere 2 doet PDO/MySQL helemaal niets mee.

Volledige code
1
2
3
<?php
  
/* niet relevant meer */
?>

Why?

[ Bericht 82% gewijzigd door Chandler op 22-03-2016 20:57:23 ]
Just say hi!
pi_160869288
Zo op het eerste oog vermoed ik dat je query->rowCount() geen 1 teruggeeft. :P
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_160869344
quote:
0s.gif Op dinsdag 22 maart 2016 20:35 schreef Monolith het volgende:
Zo op het eerste oog vermoed ik dat je query->rowCount() geen 1 teruggeeft. :P
Dat geeft ie wel, heb daarop getest.. rare is dat beide queries daarna wel gedraaid worden maar niets veranderd in de database...
Just say hi!
pi_160869777
Heb het probleem gevonden.
Het probleem zit hem in de tabellen, op een of andere manier is het vinkje in PHPMYADMIN op leeg gezet... waardoor het veld LEEG blijft... maar wanneer ik dat vinkje wil verwijderen krijg ik een foutmelding van PHPMYADMIN "#1265 - Data truncated for column 'votes' at row 8"

Iemand een workaround? want kan deze velden niet verwijderen en daarna weer terug zetten.

-edit-
Heb gewoon de gehele database gedownloaded, tabellen aangepast en data weer terug gezet.. oplossing :P

[ Bericht 21% gewijzigd door Chandler op 22-03-2016 20:56:53 ]
Just say hi!
pi_162060797
Ik probeer een lijst te krijgen van users met wie je berichten uitgewisseld uit hebt, gesorteerd op datum van het laatste bericht dat ze hebben uitgewisseld.

Momenteel heb ik dit als query:
1SELECT msg.id, m.login, msg.date_sent FROM mail_msg msg, members m WHERE msg.user_id = $auth AND ((msg.user_from = $auth AND msg.user_to = m.id) OR (msg.user_to = $auth AND msg.user_from = m.id)) AND m.id != $auth GROUP BY m.id ORDER BY msg.date_sent DESC
Hierbij is $auth de variabele is met je persoonlijke user_id.

Helaas pakt ie bij deze query niet de datum van de laatste berichtuitwisseling maar van de eerste. ORDER BY msg.date_sent ASC maakt het er niet beter op.
pi_162060859
quote:
0s.gif Op dinsdag 10 mei 2016 14:27 schreef schwa78 het volgende:
Ik probeer een lijst te krijgen van users met wie je berichten uitgewisseld uit hebt, gesorteerd op datum van het laatste bericht dat ze hebben uitgewisseld.

Momenteel heb ik dit als query:
[ code verwijderd ]

Hierbij is $auth de variabele is met je persoonlijke user_id.

Helaas pakt ie bij deze query niet de datum van de laatste berichtuitwisseling maar van de eerste. ORDER BY msg.date_sent ASC maakt het er niet beter op.
Zonder echt naar de query te hebben gekeken: zou het niet ORDER BY msg.date_sent DESC moeten zijn? Je wilt de datum immers aflopend (DESC = descending) in plaats van oplopend (ASC = ascending) hebben...
------___------ 53
----.(___).---- 42
---(o\_!_/o)---
pi_162060879
quote:
0s.gif Op dinsdag 10 mei 2016 14:30 schreef Rockfire het volgende:
Zonder echt naar de query te hebben gekeken: zou het niet ORDER BY msg.date_sent DESC moeten zijn?
Als je naar zijn query gekeken had, had je gezien dat dat precies is wat er staat..

[ Bericht 0% gewijzigd door #ANONIEM op 10-05-2016 14:32:07 ]
pi_162060893
quote:
0s.gif Op dinsdag 10 mei 2016 14:30 schreef Rockfire het volgende:

[..]

Zonder echt naar de query te hebben gekeken: zou het niet ORDER BY msg.date_sent DESC moeten zijn? Je wilt de datum immers aflopend (DESC = descending) in plaats van oplopend (ASC = ascending) hebben...
Ik heb in de query ook DESC staan. Het voorbeeld erna met ASC is alleen om aan te geven dat daar het probleem niet in schuilt.
pi_162060952
Het lijkt me dat het aan je group by ligt. Volgens mij moet het zoiets zijn:

1
2
SELECT msg.id, m.login, MAX(msg.date_sent) AS most_recent_message FROM mail_msg msg, members m 
WHERE msg.user_id = $auth AND ((msg.user_from = $auth AND msg.user_to = m.id) OR (msg.user_to = $auth AND msg.user_from = m.id)) AND m.id != $auth GROUP BY m.id ORDER BY most_recent_message DESC
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_162061303
quote:
0s.gif Op dinsdag 10 mei 2016 14:35 schreef Monolith het volgende:
Het lijkt me dat het aan je group by ligt. Volgens mij moet het zoiets zijn:
[ code verwijderd ]

Volgens mij doet ie het nu perfect! Thanks!!
pi_162255651
Hopende in het juiste topic te zijn heb ik de volgende vraag:
Ik heb een query waarbij ik data ophaal uit twee tabellen gebruikmakende van een JOIN, echter wil ik bij bepaalde situaties niks ophalen uit een kolom. De query ziet er als volgt uit:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Als het een match is doordat de opgegeven parameter(?) voorkomt in de credentials.username moet er niks worden opgehaald voor de keywords.keyword kolom. Heeft iemand een idee hoe ik dit voor elkaar krijg?
No citizen has a right to be an amateur in the matter of physical training...what a disgrace it is for a man to grow old without ever seeing the beauty and strength of which his body is capable.
pi_162256843
Je kunt dat veld dan toch gewoon niet gebruiken :?
pi_162257402
quote:
14s.gif Op maandag 16 mei 2016 22:17 schreef KomtTijd... het volgende:
Je kunt dat veld dan toch gewoon niet gebruiken :?
Dan zou ik na het uitvoeren van de query nog een stuk logica moeten schrijven om te kijken of de data opgehaald is gebruikmakende van de keywords of niet en dan de opgehaalde keywords niet te gebruiken. Alleen denk ik dat het netter en sneller zou zijn om die selectie op dbms niveau te doen dan na het ophalen nog eens een selectie uit te voeren in mijn software. (Bedankt voor het meedenken alvast!)
No citizen has a right to be an amateur in the matter of physical training...what a disgrace it is for a man to grow old without ever seeing the beauty and strength of which his body is capable.
  dinsdag 17 mei 2016 @ 09:30:44 #282
52200 ViPeRII
It's a good day to die
pi_162263162
Niet relevant meer..

[ Bericht 99% gewijzigd door ViPeRII op 17-05-2016 09:36:38 ]
-- ViPeRII --
pi_162263845
quote:
7s.gif Op maandag 16 mei 2016 21:44 schreef esv7 het volgende:
Hopende in het juiste topic te zijn heb ik de volgende vraag:
Ik heb een query waarbij ik data ophaal uit twee tabellen gebruikmakende van een JOIN, echter wil ik bij bepaalde situaties niks ophalen uit een kolom. De query ziet er als volgt uit:
SPOILER
Om spoilers te kunnen lezen moet je zijn ingelogd. Je moet je daarvoor eerst gratis Registreren. Ook kun je spoilers niet lezen als je een ban hebt.
Als het een match is doordat de opgegeven parameter(?) voorkomt in de credentials.username moet er niks worden opgehaald voor de keywords.keyword kolom. Heeft iemand een idee hoe ik dit voor elkaar krijg?
Zo uit m'n hoofd kun je gewoon een if statement in je group concat zetten, al krijg je dan wellicht wel wat onnodige whitespaces:

1
2
3
4
5
6
7
8
9
10
SELECT DISTINCT credentials.id, credentials.username, credentials.password
  GROUP_CONCAT(if((UPPER(credentials.keyword) LIKE UPPER(?),keywords.keyword,'') SEPARATOR ' ')
FROM credentials
JOIN keywords
ON credentials.id = keywords.credentials_id
WHERE (UPPER(credentials.keyword) LIKE UPPER(?)
  OR UPPER(credentials.username) LIKE UPPER(?))
AND CHAR_LENGTH(?) > 0
GROUP BY credentials.id
ORDER BY credentials.matches;

Het is sowieso wel een beetje een rommelige query en ik vraag me ook af wat je exact probeert te bereiken, functioneel gezien.
De DISTINCT op credentials.id is sowieso overbodig aangezien je er al een GROUP BY op doet.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_162275115
quote:
0s.gif Op dinsdag 17 mei 2016 10:22 schreef Monolith het volgende:

[..]

Zo uit m'n hoofd kun je gewoon een if statement in je group concat zetten, al krijg je dan wellicht wel wat onnodige whitespaces:
[ code verwijderd ]

Het is sowieso wel een beetje een rommelige query en ik vraag me ook af wat je exact probeert te bereiken, functioneel gezien.
De DISTINCT op credentials.id is sowieso overbodig aangezien je er al een GROUP BY op doet.
Het distinct keyword ben ik inderdaad vergeten te verwijderen nadat ik de GROUP BY clausule toegevoegd heb.

De functionaliteit die ik wil bereiken is het volgende:

Ik heb een tabel met credentials en een tabel met keywords, een credential kan nul of meer keywords hebben. Deze keywords kunnen worden gebruikt om naar credentials te zoeken om er vervolgens een actie op uit te voeren. Dit heb ik nu werkend in principe.

Wat ik wil bereiken is dat er wordt bijgehouden welk keyword(s) gebruikt zijn om het credential te vinden, dit kan in sommige gevallen ook geen enkel keyword zijn als er direct op een username gezocht wordt. Dit zodat er betere resultaten gegeven kunnen worden bij bepaalde zoektermen.

Wat ik hiervoor denk nodig te hebben is dat er naast het ophalen van een credential ook de gebruikte keywords opgehaald worden om deze na het uitvoeren van de actie op software niveau te kunnen updaten.
No citizen has a right to be an amateur in the matter of physical training...what a disgrace it is for a man to grow old without ever seeing the beauty and strength of which his body is capable.
pi_162360628
Ik probeer een php-scriptje te draaien in een Form-programma (RSForm) in Joomla 3.5.1.
Het draait om combinatie van mollie (iDeal-betalingen), cciDeal en RSForm. Ik krijg het voor elkaar met dit (gevonden) script om alles op te tellen in de kolom genaamd Totaal
1
2
3
4
$db = JFactory::getDBO();
 
$db->setQuery("SELECT SUM((`FieldValue`)) FROM popkoor_rsform_submission_values WHERE `FieldName`='Totaal' AND `FormId`='3'");
$directoryLayout.="  Aantal verkocht: " . "$" . $db->loadResult() . "<br/>";



Echter, ik wil een kleine toevoeging doen dat hij alleen de som berekent van de GESLAAGDE betalingen. Dat betekent dus dat _STATUS de waarde 1 moet hebben.
Echter mijn kennis schiet te kort om dit scriptje dusdanig aan te passen dat die berekening goed wordt uitgevoerd. Zou iemand mij kunnen vertellen hoe ik dit kan aanpassen zodat die extra voorwaarde wel wordt meegenomen in de berekening?
Mijn dank is groot  Heb 20 jaar geleden ooit een basiscursus SQL gehad op mijn opleiding, maar daar is weinig meer van over helaas.
I asked God for a bike, but I know God doesn't work that way.
So I stole a bike and asked for forgiveness.
pi_162362500
AND `_STATUS` = 1

Je weet trouwens dat je in Phpmyadmin gewoon een zoekactie kunt doen en de query kunt kopiëren?
  zaterdag 21 mei 2016 @ 09:15:31 #287
454594 Wedden
van wel?
pi_162374566
-edit-
pi_162374571
quote:
3s.gif Op vrijdag 20 mei 2016 20:07 schreef KomtTijd... het volgende:
AND `_STATUS` = 1
Dat leek me heel logisch, maar helaas werkt het niet. Ik krijg de foutmelding"1054
Unknown column '_STATUS' in 'where clause' SQL=SELECT SUM((`FieldValue`)) FROM #__rsform_submission_values WHERE `FieldName`='Totaal' AND `_STATUS` = 1 AND `FormId`='3'"

gebruikmakend van
1
2
3
4
$db = JFactory::getDBO();
 
$db->setQuery("SELECT SUM((`FieldValue`)) FROM popkoor_rsform_submission_values WHERE `FieldName`='Totaal' AND `_STATUS` = 1 AND `FormId`='3'");
$directoryLayout.="  Aantal verkocht: " . "$" . $db->loadResult() . "<br/>";

quote:
Je weet trouwens dat je in Phpmyadmin gewoon een zoekactie kunt doen en de query kunt kopiëren?
Ja, ik had het daar ook al uitgeprobeerd.
I asked God for a bike, but I know God doesn't work that way.
So I stole a bike and asked for forgiveness.
pi_162374679
quote:
3s.gif Op vrijdag 20 mei 2016 20:07 schreef KomtTijd... het volgende:
AND `_STATUS` = 1

Je weet trouwens dat je in Phpmyadmin gewoon een zoekactie kunt doen en de query kunt kopiëren?
Dat werkt natuurlijk niet. Status is geen kolom in de tabel, maar een aparte rij.

Je zal iets van een WHERE EXIST (subquery naar rij met status 1 en zelfde is) moeten doen.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_162374882
Volgens mij wil je dus ongeveer zoiets als query:
1SELECT SUM((p1.`FieldValue`)) FROM popkoor_rsform_submission_values p1 WHERE p1.`FieldName`='Totaal' AND p1.`FormId`='3' AND EXISTS (SELECT * FROM popkoor_rsform_submission_values p2 WHERE p2.`FieldName`='_Status' AND p2.`FieldValue` = "1" AND p1.SubmissionId = p2.SubmissionId)
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_162376745
Sorry, was niet helemaal wakker denk ik.
1
2
3
4
5
6
7
SELECT SUM(t1.fieldvalue) 
FROM popkoor_rsform_submission_values AS t1
JOIN popkoor_rsform_submission_values as t2
ON t1.submissionid = t2.submissionid 
WHERE t1.fieldname = "totaal" 
AND t2.fieldname = "_STATUS"
AND t2.fieldvalue = 1
Niet getest, maar you get the picture. Denk dat je er met zo'n soort constructie uit moet kunnen komen.
  zaterdag 21 mei 2016 @ 13:56:48 #292
454594 Wedden
van wel?
pi_162378115
-edit-

[ Bericht 50% gewijzigd door Wedden op 21-05-2016 14:11:19 ]
  zaterdag 21 mei 2016 @ 14:04:15 #293
12221 Tijn
Powered by MS Paint
pi_162378216
quote:
0s.gif Op zaterdag 21 mei 2016 13:56 schreef Wedden het volgende:

[..]

Allen dank voor het meedenken!

Het werkt nog niet helemaal. Als ik deze code van Monolith gebruik, lukt het wel in phpMyAdmin.
Zie plaatje
[ afbeelding ]

Als die code plak in de code waar ik mee begon krijg ik:
[ code verwijderd ]

Dan ziet de webpagina er echter zo uit:

[ afbeelding ]

Wordt nog even puzzelen waar het mis gaat!
Ik denk dat het probleem in PHP wordt veroorzaakt omdat je dubbele quotes om de 1 hebt staan.
pi_162378327
quote:
2s.gif Op zaterdag 21 mei 2016 14:04 schreef Tijn het volgende:

[..]

Ik denk dat het probleem in PHP wordt veroorzaakt omdat je dubbele quotes om de 1 hebt staan.
Jullie zijn helden! Bedankt!
I asked God for a bike, but I know God doesn't work that way.
So I stole a bike and asked for forgiveness.
  Moderator woensdag 25 mei 2016 @ 12:52:24 #295
55052 crew  djkoelkast
www.xms.nl
pi_162487067
Ik ben al een hele tijd bezig een systeem van de grond te krijgen waar ik als verzamelaar van oude tv-beelden samen met een groepje collegaverzamelaars onze collectie kan bijhouden.
De basis van het systeem is door iemand gebouwd, die later van de radar is verdwenen helaas.
Vervolgens was er iemand anders die het zou oppakken, maar die had ook minder tijd dan verwacht.
Ik weet wat ik vraag, het is hobby, dus ik heb geen budget. Ik kan wel in ruil iets doen waar ik goed in ben: video digitaliseren, videobewerking, voice-overwerk, mixen/remixen dat soort dingen.

Hier zijn wat plaatjes van hoe het nu is:





Het werkt alleen nog niet helemaal en het is nog lang niet af. Ik hoop dat iemand zin heeft hier in te helpen. Uiteraard mag je het systeem meenemen in je portfolio.
Luister naar XPLIZIT op www.xms.nl
Voor alles retro bezoek je het Retroforum - www.retroforum.nl
  woensdag 25 mei 2016 @ 12:55:53 #296
107951 JortK
Immer kwaliteitsposts
pi_162487167
Hoeveel mensen van jullie gebruiken trouwens een framework als bijvoorbeeld Laravel?

Ik ben er nu een aantal maal een project mee gestart, maar de overheid die het met zich meebrengt zorgt er eigenlijk altijd voor dat ik al snel overstap naar een project zonder framework.
pi_162487567
Symfony 2 hier.

De leercurve kan vrij steil zijn maar uiteindelijk levert het je een hoop gemak op.
  woensdag 25 mei 2016 @ 13:17:22 #298
134783 papernote
Een echte.
pi_162487627
Ik gebruik graag het Zend Framework.
Schuimpje... mijn liefste. Verlaat mij nimmer weer...
pi_162494622
quote:
0s.gif Op woensdag 25 mei 2016 12:55 schreef JortK het volgende:
Hoeveel mensen van jullie gebruiken trouwens een framework als bijvoorbeeld Laravel?

Ik ben er nu een aantal maal een project mee gestart, maar de overheid die het met zich meebrengt zorgt er eigenlijk altijd voor dat ik al snel overstap naar een project zonder framework.
Gezien de staat van 'vanilla PHP' zou ik eigenlijk voor elk serieus project een framework gebruiken. Wil je een simpel scriptje bouwen, dan is het wellicht overkill, maar een beetje applicatie ontwikkelen gaat tien keer sneller met een fatsoenlijk framework, al is er vaak wel een initiële leercurve.
Ik werk nu zelf veel met Java EE waarvan mensen ook nog steeds denken dat het enorm log en verbose is terwijl je tegenwoordig met een paar regels code zo wat hebt staan.
Volkorenbrood: "Geen quotes meer in jullie sigs gaarne."
pi_162494771
quote:
0s.gif Op woensdag 25 mei 2016 12:55 schreef JortK het volgende:
Hoeveel mensen van jullie gebruiken trouwens een framework als bijvoorbeeld Laravel?

Ik ben er nu een aantal maal een project mee gestart, maar de overheid die het met zich meebrengt zorgt er eigenlijk altijd voor dat ik al snel overstap naar een project zonder framework.
Ik gebruik tegenwoordig altijd een framework. Meestal Laravel, lumen of silex.

Wanneer jij terug gaat naar een project zonder framework om wat voor een opdrachten gaat het dan zoal?
pi_162501754
Laravel , heerlijk.
Redacted
abonnement bol.com Unibet Coolblue
Forum Opties
Forumhop:
Hop naar:
(afkorting, bv 'KLB')