Hallo,

Ik zit met het volgende probleem. Ik heb lang geleden wat met PHP gedaan, maar heb totaal geen idee wat er nu fout is aan mijn SQL aanroep. Ik heb begrepen dat er wijzigingen zijn in de SQL aanroep waardoor alles nu via SQLi gaat. Die stukjes script zijn allemaal aangepast van SQL naar SLQi. Maar in de debugging tool, PHPstorm, blijf ik nu de melding krijgen dat ik een parameter $query mis in mijn mysqli_query aanroep. Ik heb eerlijk werkelijk geen idee wat er nu fout gaat of wat ik mis. Uit de documentatie op de PHP site kan ik niet precies halen wat de $query parameter inhoud.

Hieronder het script. Zou iemand mijn kunnen en willen helpen? Als ik de logica door heb kan ik verder gaan met aanpassen en ombouwen.

<?
$DBhost = "host";
$DBuser = "username";
$DBpass = "password";
$DBname = "DBname";
header('Content-Type: text/html; charset=utf-8');

error_reporting(0);
@ini_set('display_errors', 0);

// error_reporting(E_ALL ^ E_NOTICE);

include("get_vars.php");
include("Mobile_Detect.php");
$detect = new Mobile_Detect();

$tijd = date("d-m-Y H:i:s");
$nieuwdatum = date("U");
$nb_dag = date("d");
$vorig_jaar = date("Y")-1;

$msql = mysqli_connect($DBhost,$DBuser,$DBpass,$DBname);

//Haal IP-adres bezoeker op
if (getenv("HTTP_CLIENT_IP")) { $uip = getenv("HTTP_CLIENT_IP"); }
elseif (getenv("HTTP_X_FORWARDED_FOR")) { $uip = getenv("HTTP_X_FORWARDED_FOR"); }
else { $uip = getenv("REMOTE_ADDR"); }

//Controleer IP-adres
$sql_ip = mysqli_query("SELECT * FROM animoso_ipblock WHERE ip = '$uip'");
if (mysqli_num_rows($sql_ip) > 0) { exit; }

// NACHTBATCH!
$rapportage_tekst = "";

// Wat is de datum van vandaag?
$vandaag = Date("d-m-Y");
$datearr2 = explode("-",$vandaag);
$d_vandaag = mktime(0,0,0,$datearr2[1],$datearr2[0],$datearr2[2]);
$datum_vandaag = strftime("%d-%m-%Y",$d_vandaag);

$d = mysqli_query("SELECT * FROM stats");
while ($record = mysqli_fetch_object($d))
{
$dd = $record->dag;
}

// Als een nieuwe dag aanbreekt, voer dan de volgende acties uit:
if ($dd <> "$nb_dag") {

// Dag = dag + 1
mysqli_query("UPDATE stats SET dag = '$nb_dag'");

mysqli_query("INSERT INTO animoso_acties VALUES('', 'HR', 'HR', 'HR', 'HR')");
mysqli_query("INSERT INTO animoso_acties VALUES('', 'Het systeem', 'heeft de nachtbatch', 'gestart', 'op $tijd')");

// Statistieken bijwerken
mysqli_query("INSERT INTO animoso_stats VALUES('', '$vandaag', '1')");

// IEDEREEN UITLOGGEN!
$rapportage_tekst = "$rapportage_tekst \n";
$sql_uitloggen = mysqli_query("SELECT * FROM animoso_leden WHERE active = '1' ORDER BY naam");
while ($record = mysqli_fetch_object($sql_uitloggen)) {
// mysqli_query("INSERT INTO animoso_acties VALUES('', 'Het systeem', 'heeft $record->vnaam $record->tussenvoegsel $record->naam', 'automatisch uitgelogd', 'op $tijd')");
$rapportage_tekst = "$rapportage_tekst Het systeem heeft $record->vnaam $record->tussenvoegsel $record->naam automatisch uitgelogd.\n";
}
mysqli_query("UPDATE animoso_leden SET active = '0', nieuwdatum = '$nieuwdatum' WHERE active = '1'");
mysqli_query("INSERT INTO animoso_acties VALUES('', 'Het systeem', 'heeft iedereen automatisch uitgelogd', 'voor de nachtbatch', 'op $tijd')");


// DEADLINE!!!
$tijd_nb = date("d-m-Y H:i:s");
$rapportage_tekst = "$rapportage_tekst \n";
$sql_optreden = mysqli_query("SELECT * FROM animoso_optredens WHERE blok = '0' AND jaar > '$vorig_jaar' AND status <> 'Geannuleerd'");
while ($record = mysqli_fetch_object($sql_optreden)) {
if ($record->d_dag<>"" && $record->d_dag>0) {

// Wat is de datum waarop de deadline is verstreken?
// $deadline = "-$record->deadline";
// $deadline = $deadline - 7;
$optreden_datum = "$record->dag-$record->maand-$record->jaar";
// $datearr = split("-",$optreden_datum);
// $timestamp = mktime(0,0,0,$datearr[1],$datearr[0],$datearr[2]);
// $timestamp2 = strtotime("$deadline days",$timestamp);
// $deadline_datum = strftime("%d-%m-%Y",$timestamp2);
$deadline_datum = "$record->d_dag-$record->d_maand-$record->d_jaar";
$datearr = split("-",$deadline_datum);
$timestamp = mktime(0,0,0,$datearr[1],$datearr[0],$datearr[2]);
$timestamp2 = strtotime("-7 days",$timestamp);
$herinnering_datum = strftime("%d-%m-%Y",$timestamp2);

if ((strtotime($datum_vandaag)) == strtotime($optreden_datum)) {
$rapportage_tekst = "$rapportage_tekst Het optreden $record->omschrijving vindt vandaag plaats in $record->locatie.\n";
mysqli_query("INSERT INTO animoso_acties VALUES('', 'Het optreden', '$record->omschrijving', 'vindt vandaag', 'plaats in $record->locatie')");
}

// Als vandaag -7 dagen een deadline is verstreken...
if ((strtotime($datum_vandaag)) == strtotime($herinnering_datum)) {
$rapportage_tekst = "$rapportage_tekst De deadline voor optreden $record->omschrijving is over 7 dagen verstreken.\n";
mysqli_query("INSERT INTO animoso_acties VALUES('', 'De deadline', 'voor optreden $record->omschrijving', 'is verstreken', 'over 7 dagen')");

// Selecteer alle leden...
$sql_leden= mysqli_query("SELECT * FROM animoso_leden WHERE rechten > '0' AND optredens = 1 ORDER BY naam");
while ($record2 = mysqli_fetch_object($sql_leden)) {
// Mail dan de mensen die hun status 'Ik weet het nog niet' hebben...
$sql_bezetting = mysqli_query("SELECT * FROM animoso_bezetting WHERE optreden = '$record->id' AND uid = '$record2->id' AND blok = '0'");
if (mysqli_num_rows($sql_bezetting)>0) {
while ($record3 = mysqli_fetch_object($sql_bezetting)) {
if ($record3->status=="Ik weet het nog niet") {
// Mail dan de mensen die hun status 'Onbekend' hebben...
$rapportage_tekst = "$rapportage_tekst $record2->vnaam $record2->tussenvoegsel $record2->naam heeft status 'Ik weet het nog niet' voor optreden $record->omschrijving en heeft een herinnering ontvangen op $record2->emailadres\n";
mail("$record2->emailadres", "Herinnering '$record->omschrijving'", "Beste $record2->vnaam,\n\nOp $record->dag-$record->maand-$record->jaar vindt het optreden '$record->omschrijving' plaats. Je hebt aangegeven dat je nog niet weet of je wel of niet aanwezig zal zijn. Laat dat alsnog even weten door hieronder de gewenste optie te kiezen. Wil je dat voor $deadline_datum doen, ook als je niet komt.\n\n----------------\nKlik hier als je kunt spelen: http://leden.animoso.nl/aanmelden.php?actie=ja&optreden=$record->id&uid=$record2->id&checksum=$record2->checksum\nKlik hier als je NIET kunt spelen: http://leden.animoso.nl/aanmelden.php?actie=nee&optreden=$record->id&uid=$record2->id&checksum=$record2->checksum\n----------------\n\nJe kunt je uiteraard ook vanuit leden.animoso.nl aan- of afmelden.\n\nAlvast bedankt!\n\nAnimoso.nl",
"From: Sambaband Animoso<[email protected]>\n"
."Reply-To: [email protected]\n"
."X-Mailer: PHP/" . phpversion());
mysqli_query("INSERT INTO animoso_acties VALUES('', '$record2->vnaam $record2->tussenvoegsel $record2->naam', 'heeft een herinnering', 'voor [$record->omschrijving] ontvangen', 'op $tijd')");
}
}
} else {
// Mail dan de mensen die hun status 'Onbekend' hebben...
$rapportage_tekst = "$rapportage_tekst $record2->vnaam $record2->tussenvoegsel $record2->naam heeft status 'Onbekend' voor optreden $record->omschrijving en heeft een herinnering ontvangen op $record2->emailadres\n";
mail("$record2->emailadres", "Herinnering '$record->omschrijving'", "Beste $record2->vnaam,\n\nOp $record->dag-$record->maand-$record->jaar vindt het optreden '$record->omschrijving' plaats. Je hebt nog niet aangegeven of je wel of niet aanwezig zal zijn. Laat dat alsnog even weten door hieronder de gewenste optie te kiezen. Wil je dat voor $deadline_datum doen, ook als je niet komt.\n\n----------------\nKlik hier als je kunt spelen: http://leden.animoso.nl/aanmelden.php?actie=ja&optreden=$record->id&uid=$record2->id&checksum=$record2->checksum\nKlik hier als je NIET kunt spelen: http://leden.animoso.nl/aanmelden.php?actie=nee&optreden=$record->id&uid=$record2->id&checksum=$record2->checksum\n----------------\n\nJe kunt je uiteraard ook vanuit leden.animoso.nl aan- of afmelden.\n\nAlvast bedankt!\n\nAnimoso.nl",
"From: Sambaband Animoso<[email protected]>\n"
."Reply-To: [email protected]\n"
."X-Mailer: PHP/" . phpversion());
mysqli_query("INSERT INTO animoso_acties VALUES('', '$record2->vnaam $record2->tussenvoegsel $record2->naam', 'heeft een herinnering', 'voor [$record->omschrijving] ontvangen', 'op $tijd')");
}
}
}
}
}

$tijd_nb = date("d-m-Y H:i:s");
// VERJAARDAGEN!!!
$rapportage_tekst = "$rapportage_tekst \n";
$sql_leden2= mysqli_query("SELECT * FROM animoso_leden WHERE rechten > '0' AND id <> '3' ORDER BY naam");
while ($record5 = mysqli_fetch_object($sql_leden2)) {
$geboortedatum_db = $record5->geboortedatum;
// $geboortedatum_db = str_replace("-1-","-01-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-2-","-02-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-3-","-03-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-4-","-04-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-5-","-05-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-6-","-06-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-7-","-07-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-8-","-08-",$geboortedatum_db);
// $geboortedatum_db = str_replace("-9-","-09-",$geboortedatum_db);
if ($geboortedatum_db<>"") {
$datearr3 = split("-",$geboortedatum_db);
$geboortedatum = "$datearr3[0]-$datearr3[1]";
$vandaag_geboorte = date("d-m");
if ($vandaag_geboorte==$geboortedatum) {
$rapportage_tekst = "$rapportage_tekst $record5->vnaam $record5->tussenvoegsel $record5->naam is vandaag ($record5->geboortedatum) jarig!\n";
mysqli_query("INSERT INTO animoso_acties VALUES('', '$record5->vnaam $record5->tussenvoegsel $record5->naam', 'is', 'jarig', 'vandaag')");
$sql_leden22= mysqli_query("SELECT * FROM animoso_leden WHERE rechten > '0' AND verjaardagsherinnering = '1' ORDER BY naam");
while ($record22 = mysqli_fetch_object($sql_leden22)) {
mail("$record22->emailadres", "Verjaardagsherinnering", "Beste $record22->vnaam,\n\nVandaag is $record5->vnaam $record5->tussenvoegsel $record5->naam jarig (geboren: $record5->geboortedatum).\n\nMocht je deze verjaardagsherinneringen niet meer willen ontvangen, schakel de optie dan uit onder 'Mijn gegevens' op leden.animoso.nl.\n\nAnimoso.nl",
"From: Sambaband Animoso<[email protected]>\n"
."Reply-To: [email protected]\n"
."X-Mailer: PHP/" . phpversion());
}
}
}
}

// Rapportage
// mail("[email protected]", "Rapportage Nachtbatch
//$datum2", "---- BEGIN RAPPORTAGE ----\n\nDe Nachtbatch van
//$tijd is met succes afgerond.\n\n$rapportage_tekst\n\n----
//EINDE RAPPORTAGE ----",
// "From: Sambaband Animoso<[email protected]>\n"
// ."Reply-To: [email protected]\n"
// ."X-Mailer: PHP/" . phpversion());

$tijd_nb = date("d-m-Y H:i:s");
mysqli_query("INSERT INTO animoso_acties VALUES('', 'Het systeem', 'heeft de nachtbatch', 'succesvol uitgevoerd', 'op $tijd_nb')");
} else {
mysqli_query("UPDATE animoso_stats SET aantal = aantal + 1 WHERE datum = '$vandaag'");
}
?>
zie http://php.net/mysqli-query

mysqli_query heeft per se minimaal 2 parameters nodig.

mysql_query() had ook de mogelijkheid om er 2 mee te geven, maar had de 2e optioneel.
nu zijn nr 1 en 2 van plek gewisseld EN verplicht

[size=xsmall]Toevoeging op 29/01/2019 10:05:51:[/size]

en op regel 22 maak je de betreffende var aan: $msql;
Bedankt voor jullie antwoorden!

Als ik het goed begrijp moet ik er dus dit van maken? de $msql parameter meenemen om de connectie te specificeren.

$sql_ip = mysqli_query($msql,"SELECT * FROM animoso_ipblock WHERE ip = '$uip'");
Klopt! Al is het beter om je velden te benoemen in plaats van * te kiezen.
als je een lijst wilt maken van opmerkingen over dit script: neem meer dan 1 blaadje papier mee....

Er zitten echt juweeltjes tussen.
<?php
$vandaag = Date("d-m-Y");
$datearr2 = explode("-",$vandaag);
$d_vandaag = mktime(0,0,0,$datearr2[1],$datearr2[0],$datearr2[2]);
$datum_vandaag = strftime("%d-%m-%Y",$d_vandaag);
?>

Waarom niet niet
<?php
$vandaag = Date("d-m-Y");
$datum_vandaag = $vandaag;
?>


of
<?php
$d = mysqli_query("SELECT * FROM stats");
while ($record = mysqli_fetch_object($d))
{
$dd = $record->dag;
}

// Als een nieuwe dag aanbreekt, voer dan de volgende acties uit:
if ($dd <> "$nb_dag") {
}
?>
Je haalt dus alle records op uit een tabel. Volgorde willekeurig.
je loopt door de resultaten, en kijkt tenslotte daarna, (nadat je misschien inmiddels 1000 keer zinloos een rondje hebt gedaan, of de inhoud van het laatste record toevallig het nummer bevat van de datum van de huidige dag.
(zonder relatie met welk record dat was, en of er misschien ook nog een maand en een jaar van belang waren.

Datum, waar je tenminste nog ooit iets zinnigs mee wilt, sla je op in een kolom van het type DATE (of DATETIME)

Dus dan zou de query zijn:

<?php
$d = mysqli_query($msql, "SELECT COUNT(1) vandaaggedaan FROM stats WHERE datum >= CURRENT_DATE;");
$dd = $record->vandaaggedaan ;

// Als een nieuwe dag aanbreekt, voer dan de volgende acties uit:
if ($dd == 0) {
}
?>


En zulke grappen met datums doe je bij bijna elke query. 4 of 5 regels om allerlei onderdelen van datums te goochelen tot je een datum in een formaat hebt.
Terwijl de database gewoon met NOW() of CURRENT_DATE kan bepalen wat de datum van dit moment is.


Verder:
INSERT query's.
Als je daarin ook de kolommen noemt, hoef je a) niet een auto-increment kolom met een lege string te vullen en b) loop je niet het risico dat de volgorde ooit wijzigt, of als je een kolom toevoegt, je alle query's moet aanpassen. Dus ook de query's die eigenlijk niets met die kolom gaan doen.

Zeker ook, omdat veel variabele nogal korte namen hebben: $dd, $d of $tijd_nb.

(waarbij tijd_nb dus in een onbruikbaar formaat wordt opgeslagen: NOW() in een datetime kolom was eenvoudiger geweest EN je zou er ook op kunnen sorteren.
@Ivo_p,

Bedankt voor op opmerkingen. Dit script zelf is alleen de pagina waarmee de hoofdconnecties worden gelegd. De website telt nog zo'n 60 andere pagina's met script. Ik moet dus ergens gaan beginnen.

We hebben als band in 2008 een eigen ledensite gebouwd volledig in PHP, deze werkte prima totdat de hosting partij overging naar PHP versie 7.0. Daarmee zijn we nu verplicht de webpagina compleet na te kijken. En heel eerlijk heb ik sinds de bouw van de website niet meer veel met PHP gedaan. Ik probeer er dus weer in te komen, maar heb verder zelf geen uitgebreide kennis.

Misschien een rare vraag, maar is het wel om te bouwen? We zijn er ook over aan het nadenken om de ledensite door een professional na te laten kijken, maar dat zal ook een aardige duit geld kosten.

Maar ik zal zeker de aanbevelingen mee nemen. Ik zag bijvoorbeeld ook al dat het niet meer mag starten met <?, maar nu echt <?php nodig heeft.
Er valt hierboven aan bijna elke regel iets te verbeteren.

Ik persoonlijk zou geheel opnieuw beginnen, en kijken of de oude data omgezet kan worden, zodat het niet verloren gaat.


Het is niet alleen een kwestie van verouderde functies (zoals mysql) maar ook onhandige dingen als "haal alle statistieken op (over 10 jaar dus kennelijk), doe er niets mee en kijk wat je als laatste binnen krijgt.
of in 4/5 regels met stukken datum schuiven tot je het formaat hebt dat je wilde.


PHP 7.0 is trouwens ook al verouderd.
Ik zou nu voor 7.2 of 7.3 gaan.

Of kijken of je site niet in een framework als Wordpress gehangen kan worden (of ander meer op community gericht zoals Elgg of zo (als dat nog bestaat)
Dat framework was ons eerste idee. Dan hoeven zelf niets meer naar PHP om te bouwen. Helaas is er niets passends te vinden in de plug-ins van Wordpress of Joomla. We kunnen nog eens kijken of we misschien zelf daar iets kunnen bouwen, maar dan ben je alsnog zelf aan het bouwen.

Ik maak gebruik van PHPStorm om de code te controleren. Ik denk dat die automatisch in de laatste versie van PHP controleert. Maargoed, ik zou verwachten dan ondanks dat we heel omslachtig de data binnenhalen en gebruiken het wel zou moeten werken als we het script goed aanpassen. Desondanks krijg ik alleen een databaseconnectie, maar krijg geen query's uitgevoerd. Daarop heb ik eens een simpel stukje code in een pagina gezet en ook deze geeft geen data terug.

Doe ik nu echt zelf iets fout of zit er ook iets met de database niet goed?

<?php
$servername = "server";
$username = "user";
$password = "pass";
$dbname = "db";

// Create connection
$conn = mysqli_connect($servername, $username, $password, $dbname);
// Check connection
if (!$conn) {
die("Connection failed: " . mysqli_connect_error());
}

$sql = "SELECT id, vnaam, naam FROM animoso_leden";
$result = mysqli_query($conn, $sql);

if (mysqli_num_rows($result) > 0) {
// output data of each row
while($row = mysqli_fetch_assoc($result)) {
echo "id: " . $row["id"]. " - Voornaam: " . $row["vnaam"]. "-Achternaam" . $row["naam"]. "<br>";
}
} else {
echo "0 results";
}

mysqli_close($conn);

zet eens bovenaan in het script
<?php
error_reporting(E_ALL);
ini_set('display_errors', true);
?>

Krijg je dan meldingen te zien?

[size=xsmall]Toevoeging op 30/01/2019 15:32:33:[/size]

ep op de huidige regel 16 zou kunnen helpen:

<?php
if(!$result) {
echo mysqli_error($conn);
}
?>
Ik krijg meldingen. Mijn verbinding naar de database werkt geeft het script aan. Maar hij kan de sqli scripts niet uitvoeren zover ik het begrijp.

Notice: Trying to get property of non-object in /home/public/sites/timo.animoso.nl/simple.php on line 21
0 resultsSuccess: A proper connection to MySQL was made! The my_db database is great.
Warning: mysqli_get_host_info(): Couldn't fetch mysqli in /home/public/sites/timo.animoso.nl/simple.php on line 39
Host information:
Warning: mysqli_close(): Couldn't fetch mysqli in /home/public/sites/timo.animoso.nl/simple.php on line 41

Reageren