Door
- Rob -
op 03-12-2016 12:32
gewijzigd op 03-12-2016 12:33
5.197 views
Hallo!
Ik had een vraag, hoe kan ik netzo als wordpress de config instellen met een form? Dat je gegevens invoert, zoals language, database-naam, wachtwoord, database-host en tabelprefix. Als jullie weten waar ik dit kan vinden kan je ook een link sturen, of gewoon een bericht met de info. Alvast bedankt!
Ik heb het script uitgetest, en het draait prima. En zo moeilijk was het ook niet eens ;-).
Het enige nadeel is dat de hoofdstukken ([database]) niet worden opgeslagen. PHP vindt die blijkbaar niet zo belangrijk. Maar met het gebruik van prefixes (db_host) kan je zelf toch voldoende groeperen. readini.php
<?php
/* NIEUWE SETTINGS! Je kan hier je POST variabelen gebruiken in de values. Verder gewoon fictieve waardes en keys */
$array = array(
'db_host' => 'localhost',
'db_name' => 'a',
'db_user' => 'a',
'db_password' => 'c',
'sitestatus' => 1,
'encoding' => 'ANSI'
);
write_php_ini($array, "datafile.ini");
/*DO NOT EDIT UNDER THIS LINE! */
/* ==============================================================*/
function write_php_ini($array, $file)
{
$res = array();
foreach($array as $key => $val)
{
if(is_array($val))
{
$res[] = "[$key]";
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
}
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
}
safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave)
{ if ($fp = fopen($fileName, 'w'))
{
$startTime = microtime(TRUE);
do
{ $canWrite = flock($fp, LOCK_EX);
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
if(!$canWrite) usleep(round(rand(0, 100)*1000));
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));
//file was locked so now we can store information
if ($canWrite)
{ fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fclose($fp);
}
}
?>
Ik heb het script uitgetest, en het draait prima. En zo moeilijk was het ook niet eens ;-).
Het enige nadeel is dat de hoofdstukken ([database]) niet worden opgeslagen. PHP vindt die blijkbaar niet zo belangrijk. Maar met het gebruik van prefixes (db_host) kan je zelf toch voldoende groeperen. readini.php
<?php
/* NIEUWE SETTINGS! Je kan hier je POST variabelen gebruiken in de values. Verder gewoon fictieve waardes en keys */
$array = array(
'db_host' => 'localhost',
'db_name' => 'a',
'db_user' => 'a',
'db_password' => 'c',
'sitestatus' => 1,
'encoding' => 'ANSI'
);
write_php_ini($array, "datafile.ini");
/*DO NOT EDIT UNDER THIS LINE! */
/* ==============================================================*/
function write_php_ini($array, $file)
{
$res = array();
foreach($array as $key => $val)
{
if(is_array($val))
{
$res[] = "[$key]";
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
}
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
}
safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave)
{ if ($fp = fopen($fileName, 'w'))
{
$startTime = microtime(TRUE);
do
{ $canWrite = flock($fp, LOCK_EX);
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
if(!$canWrite) usleep(round(rand(0, 100)*1000));
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));
//file was locked so now we can store information
if ($canWrite)
{ fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fclose($fp);
}
}
?>
Dat laat zien hoe je je datafile.ini kan uitlezen. Dat is gewoon een standaard PHP-functie die ik voor het gemak met print_r() (print array) laat zien. Ik zou print_r() zeker niet in productie gebruiken.
Met dit kan je bijvoorbeeld je waarde van db_user ophalen.
Hallo! Ik wil graag dat hij dat script alleen uitvoerd als er een $_POST is gebeurd, maar als ik dit instell met
if (isset($_POST["start"]))
komt het op een wit scherm met de error: Fatal error: Uncaught Error: Call to undefined function write_php_ini() in C:\xampp\htdocs\Bedrijfspaneel\install.php:21 Stack trace: #0 {main} thrown in C:\xampp\htdocs\Bedrijfspaneel\install.php on line 21. hieronder staat de code die ik heb gebruikt.
if (isset($_POST["start"])) {
$array = array(
'db_host' => 'localhost',
'db_name' => 'b',
'db_user' => 'a',
'db_password' => 'c',
'sitestatus' => 1,
'encoding' => 'ANSI'
);
write_php_ini($array, $_SERVER["DOCUMENT_ROOT"]."/../datafile.ini");
/*DO NOT EDIT UNDER THIS LINE! */
/* ==============================================================*/
function write_php_ini($array, $file)
{
$res = array();
foreach($array as $key => $val)
{
if(is_array($val))
{
$res[] = "[$key]";
foreach($val as $skey => $sval) $res[] = "$skey = ".(is_numeric($sval) ? $sval : '"'.$sval.'"');
}
else $res[] = "$key = ".(is_numeric($val) ? $val : '"'.$val.'"');
}
safefilerewrite($file, implode("\r\n", $res));
}
function safefilerewrite($fileName, $dataToSave)
{ if ($fp = fopen($fileName, 'w'))
{
$startTime = microtime(TRUE);
do
{ $canWrite = flock($fp, LOCK_EX);
// If lock not obtained sleep for 0 - 100 milliseconds, to avoid collision and CPU load
if(!$canWrite) usleep(round(rand(0, 100)*1000));
} while ((!$canWrite)and((microtime(TRUE)-$startTime) < 5));
//file was locked so now we can store information
if ($canWrite)
{ fwrite($fp, $dataToSave);
flock($fp, LOCK_UN);
}
fclose($fp);
}
}
}
[size=xsmall]Toevoeging op 14/01/2017 10:38:02:[/size]
Zonder te controleren of er een POST is gedaan met start geeft die deze error niet.
[size=xsmall]Toevoeging op 14/01/2017 10:43:19:[/size]
SOLVED
Functies moeten buiten de controleer functie van de POST, anders werkt het niet.
Mijn manier is eigenlijk theoretisch gezien het enige juiste. Beiden zal wel werken, maar in mijn ogen is het wel foutgevoeliger als je iets met de submitknop doet. Je wilt immers een formulier 'posten' en niet kijken of er op een knop is gedrukt.
Misschien is die knop er geeneens, en dan kan je het ook niet versturen.
Misschien even een timeout in dit topic inlassen? Topicstarter springt van de hak op de tak. Probeer eens wat uit, en zorg ervoor dat je begrijpt wat je doet.
Iemand kan code voor je kloppen, maar op den duur moet je zelf weten van de hoed en de rand. Behandel één onderwerp per keer en werk dit af voordat je aan iets ander begint. Persoonlijk kom je nogal chaotisch over.
En als je dan toch code dumpt met print_r(), doe dit dan veilig. Zelfs in een testomgeving (die vaak in verbinding staat met het internet). Hetgeen je uitpoept op het scherm kan HTML / JavaScript bevatten.
EDIT: daarnaast doe je er verstandig aan om functies in aparte bestanden onder te brengen die je, mits je deze vaak gebruikt, altijd include. Het is niet handig / verstandig om deze "inline" of zelfs binnen conditionele statements te zetten omdat deze dan maar (heel) soms gedeclareerd zijn.