het is mooi geworden alleen de eerste versie was al goed bij mij da decimalen was oneindig dus naar mijn zin goed had da van 0 mag niet en over de 100 zelf al gefixt.
maar zeker allemaal bedankt!
het is mooi geworden alleen de eerste versie was al goed bij mij da decimalen was oneindig dus naar mijn zin goed had da van 0 mag niet en over de 100 zelf al gefixt.
maar zeker allemaal bedankt!
Hier de allerlaatste edit:
<?php
// Balk generator gemaakt door GrootScripting, bewerkt door Killingdevil
// Verander onderstaande variabelen naar je eigen wensen
$maxdecimalen = 2; // Geef hier het maximaal aantal decimalen op, 0 is hele getallen
$breedte = 152; // Afbeeldingsbreedte
$hoogte = 17; // Afbeeldingshoogte
$border = 1; // Omlijningsbreedte
$correctie = 1; // Eventuele correctie voor de onderkant en rechterkant, bij sommige webservers nodig, zet op 0 voor geen veranderingen.
$lettergrootte = 3; // 3 is standaard, mag maximaal 5 zijn en minimaal 1. (de uitlijning kan s bij sommige lettergroottes niet kloppen, dan moet je in de functies iets aanpassen).
// Verander onderstaande constanten naar eigen waarde
define("tekens", "% klaar"); // Eventuele tekens weergeven achter het aantal procent (zoals het procent teken etc.)
define("uitlijning", "links"); // Hoe de tekst uitgelijnd moet worden, kan de waardes "centreer", 'links' of 'rechts' bevatten, standaardwaarde is "centreer"
define("scheidingsteken", "."); // Teken om decimalen te scheiden in de output, input moet wel met punten.
// HIERONDER ALLEEN AANPASSEN ALS JE WEET WAT JE DOET!!!
$procent = $_GET['procent'];
$split = explode('.', $procent);
if(strlen($split[1]) > $maxdecimalen){
echo '<font color="red" face="arial">Je mag maximaal <b>'.$maxdecimalen.' decimalen</b> gebruiken, jij gebruikt nu <b>'.strlen($split[1]).' decimalen</b>.</font>';
} else{
if(is_numeric($procent) && $procent >= 0 && $procent <= 100){
// Maak de achtergrond afbeelding (125x17)
$afbeelding = imagecreate($breedte, $hoogte);
// Definieër de kleuren
switch($_GET['stijl']){
case "rood":
$achtergrond = imagecolorallocate($afbeelding, 125, 0, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 0, 0);
break;
case "geel":
$achtergrond = imagecolorallocate($afbeelding, 255, 106, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 216, 0);
break;
case "blauw":
$achtergrond = imagecolorallocate($afbeelding, 0, 0, 125);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 0, 255);
break;
case "paars":
$achtergrond = imagecolorallocate($afbeelding, 33, 0, 127);
$voorkantkleur = imagecolorallocate($afbeelding, 87, 0, 127);
break;
case "rose":
$achtergrond = imagecolorallocate($afbeelding, 178, 0, 255);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 0, 220);
break;
case "grijs":
$achtergrond = imagecolorallocate($afbeelding, 0, 0, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 64, 64, 64);
break;
case "bruinrood":
$achtergrond = imagecolorallocate($afbeelding, 91, 63, 60);
$voorkantkleur = imagecolorallocate($afbeelding, 133, 21, 11);
break;
case "turquoise":
$achtergrond = imagecolorallocate($afbeelding, 0, 148, 255);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 255, 255);
break;
default:
$achtergrond = imagecolorallocate($afbeelding, 0, 125, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 255, 0);
break;
}
$tekstkleur = imagecolorallocate($afbeelding, 255, 255, 255);
$randkleur = imagecolorallocate($afbeelding, 0, 0, 0);
$grootte = round(($procent/100) * $breedte);
// Teken het vierkant op basis van de gegeven procenten
imagefilledrectangle($afbeelding, $border, $border, $grootte - $border - $correctie, $hoogte - $border - $correctie, $voorkantkleur);
// Schrijf het aantal procent op
if(constant("uitlijning") == "links"){
textAlignLeft($afbeelding, $procent . constant("tekens"), $tekstkleur);
} else if(constant("uitlijning") == "rechts"){
textAlignRight($afbeelding, $procent . constant("tekens"), $tekstkleur);
} else{
textAlignCenter($afbeelding, $procent . constant("tekens"), $tekstkleur);
}
imagerectangle($afbeelding, 0, 0, $breedte-1, $hoogte-1, $randkleur);
// Schrijf het bestand naar de browser
header('Content-Type: image/png');
imagepng($afbeelding);
imagedestroy($afbeelding);
} else{
echo '<font face="arial" color="red">Dit is geen geldig getal, of het getal ligt niet tussen de 0 en 100.</font>';
}
}
function textAlignCenter($image, $string, $color) {
global $lettergrootte;
$padding_left = (imagesx($image) - 8 * strlen($string)) / 2;
$padding_top = (imagesy($image) - 14) / 2;
$string_split = explode(".", $string);
if(count($string_split[1]) > 0){
$string = $string_split[0].constant("scheidingsteken").$string_split[1];
} else{
$string = $string_split[0];
}
imagestring($image, $lettergrootte, $padding_left, $padding_top, $string, $color);
}
function textAlignLeft($image, $string, $color) {
global $lettergrootte;
$padding_top = (imagesy($image) - 14) / 2;
$string_split = explode(".", $string);
if(count($string_split[1]) > 0){
$string = $string_split[0].constant("scheidingsteken").$string_split[1];
} else{
$string = $string_split[0];
}
imagestring($image, $lettergrootte, 8, $padding_top, $string, $color);
}
function textAlignRight($image, $string, $color) {
global $lettergrootte;
$padding_top = (imagesy($image) - 14) / 2;
$padding_left = (imagesx($image) - 8 * strlen($string));
$string_split = explode(".", $string);
if(count($string_split[1]) > 0){
$string = $string_split[0].constant("scheidingsteken").$string_split[1];
} else{
$string = $string_split[0];
}
imagestring($image, $lettergrootte, $padding_left, $padding_top, $string, $color);
}
?>
Toon Meer
Hij gaf namelijk altijd een . neer, ook als je geen decimalen had.
Tevens een nutteloze variabele eruit gehaald.
Ik nam het topic even door (ja elke pagina). Maar is het niet beter als het gewoon via bijv 'balk.php' ipv balk.php?ver=50. Via een function kan dat tog wel lukken? Dat lijkt mij veel beter? Of zit ik ernaast?
Dat werkt niet handig.
Als je via een criminal namelijk een status aanvraagd, is het % voor elke gebruiker verschillend.
Dus moet je of via een POST (kan niet bij een <img> tag) of via een GET werken.
Of je moet voor elke user een bestand aanmaken...
lars edit ook het script bij scripts :p
@Lars ik ga even een voorbeeltje maken van wat ik bedoel. Ik vind em zelf wel veiliger? Ik post em zo.
Dit is gewoon veilig?
Post er maar eens PHP of JS of desnoods MySQL code in, werkt niet.
Alleen getallen met een waarde hoger dan of gelijk aan 0 en lager dan of gelijk aan 100 werken ;).
Nieuwe reactie samengevoegd met originele reactie op 30.12.10 21:04:37:
Ik kan niet bewerken, dan krijg ik dit:
http://www.plaatjesupload.nl/b…0/12/30/1293725320-80.png
admin laten doen :p
Ik heb ff wat geprobeerd maar kom er niet echt helemaal uit. Misschien kan iemand helpen? Maar ik denk dat dit veiliger is dan die er nu staat:
Script:
<?php
function createBalk($procent){
if($procent > 0 && $procent < 100){
$afbeelding = imagecreate(152, 17);
$background = imagecolorallocate($afbeelding, 0, 125, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 255, 0);
$tekstkleur = imagecolorallocate($afbeelding, 0, 0, 0);
$grootte = round($procent/100*150);
imagefilledrectangle($afbeelding, 1, 1, $grootte, 15, $voorkantkleur);
imagestring($afbeelding, 4, 60, 1, $procent.' %', $tekstkleur);
header('content-type: image/png');
ImageString($afbeelding, 1, 1, $grootte, 15, $voorkantkleur);
imagepng($afbeelding);
imagedestroy($afbeelding);
} else{
echo 'Ongeldig!';
}
} // END FUNCTION
?>
Toon Meer
Zo roep je em op:
Online voorbeeld: Klikkerdeklik
Zo zou die ook kunnen ja.
Maar voordeel is: je houd zo alles gescheiden.
Ik ga niet alles voorkauwen / doen.
Tevens was het een idee aanvraag, de TS wou hetzelfde als een site en die werkt via een apparte pagina, dus maak ik dat ook.
Dus het kan: ja.
Is het handig: nee.
Omdat je hem nu of in de header.php plaatst = elke pagina extra bandwidth (GD is veel bandwidth) of je plaatst hem in 10 verschillende bestanden = als je iets wil aanpassen veel werk.
heb ik ook al eens geprobeerd moet met heel ingewikkelde functies heb wel eens wat gelezen over imagecreate(200, 200); kijk daar eens naar
@iSilverStar: Volgens jou is dat veiliger? Ten eerste zat er in het script van Lars geen beveiligingsfout, en daarnaast heeft niemand wat aan jou volgens mij. Geef aan waarom je dat denkt, dan kunnen we er iets mee.
Wat betreft de constante heb je me verkeerd begrepen. Constante gebruik je als waarden voor een variabele. De waarde van een constante is daarmee ook bijna altijd een integer, dat werkt het makkelijkst. Deze constante gebruik je vervolgens om de variabele tegen te vergelijken of een waarde toe te kennen.
Voorbeeld wat op jouw script staat is bijvoorbeeld de left, center en right mogelijkheid voor de uitlijning van de tekst.
<?php
define("ALIGN_CENTER", 1);
define("ALIGN_RIGHT", 2);
define("ALIGN_LEFT", 3);
$alignment = ALIGN_CENTER;
if($alignment == ALIGN_LEFT) {
...
} else if($alignment == ALIGN_RIGHT) {
...
} else {
...
}
?>
Toon Meer
Constante worden overigens altijd geheel in HOOFDLETTERS geschreven. Zo is het meteen duidelijk dat het om een constante gaat.
Hopelijk is het duidelijk wat ik hiermee bedoel.
Ik snap niet dat lars een aantal stappen van stefan niet heeft overgenomen qua handigheid.
Zoals de check of de procent bestaat anders is hij 0 zoals ongeveer dit: $procent isset($_GET['procent']) ? round($_GET['procent'], 2) : 0;
Ook vind ik de globals zeer lelijk gebruik hiervoor dan ook de defines.
Je kan trouwens ook te veel commentaar geven maar ook te weinig, ik zie dat je bij de functions in dit geval helemaal geen commentaar geeft en bij variabelen weer te veel.
Misschien kan je dit ook korter en simpeler houden?
CitaatOok vind ik de globals zeer lelijk gebruik hiervoor dan ook de defines.
Zou je kunnen toelichten wat je hier mee bedoeld? Ik snap je niet helemaal.
CitaatJe kan trouwens ook te veel commentaar geven maar ook te weinig, ik zie dat je bij de functions in dit geval helemaal geen commentaar geeft en bij variabelen weer te veel.
Misschien kan je dit ook korter en simpeler houden?
Eens. Een goed stuk script moet eigenlijk zelfs zo duidelijk zijn dat commentaar overbodig is. Een script waar je doorheen bladert met het idee:
Hmm.. Ja.. Duidelijk.. Hmm.. Duidelijk.. Ahh, saai...
Als het zo duidelijk is dat het niet meer interessant is om door te lezen, dan doe je het goed! :p
Ik zeg het denk fout , maar waarom gebruik je globals terwijl je eigenlijk ook een parameter kan mee geven.
Ik zie even af van de global in dit geval , geef mij even een goeie reden waarom een global in dit geval handiger is als een parameter.
Zo dan beter
<?php
// Balk generator gemaakt door GrootScripting, bewerkt door Killingdevil
// Verander onderstaande constanten naar eigen waarde
define("MAXDECIMALEN", 2); // Geef hier het maximaal aantal decimalen op, 0 is hele getallen
define("BREEDTE", 152); // Afbeeldingsbreedte
define("HOOGTE", 17); // Afbeeldingshoogte
define("BORDER", 1); // Omlijningsbreedte
define("CORRECTIE", 1); // Eventuele correctie voor de onderkant en rechterkant, bij sommige webservers nodig, zet op 0 voor geen veranderingen.
define("LETTERGROOTTE", 3); // 3 is standaard, mag maximaal 5 zijn en minimaal 1. (de uitlijning kan s bij sommige lettergroottes niet kloppen, dan moet je in de functies iets aanpassen).
define("TEKENS", "% klaar"); // Eventuele tekens weergeven achter het aantal procent (zoals het procent teken etc.)
define("ALIGN", 1); // Hoe de tekst uitgelijnd moet worden, kan de waardes 1, 2 of 3 bevatten, 1 is links, 2 is gecentreerd en 3 is rechts.
define("SCHEIDINGSTEKEN", ","); // Teken om decimalen te scheiden in de output, input moet wel met punten.
// HIERONDER ALLEEN AANPASSEN ALS JE WEET WAT JE DOET!!!
$procent = $_GET['procent']; // Procenten in een variabele zetten = minder loadtime en sneller aan te roepen
$split = explode('.', $procent); // Kijken hoeveel decimalen er in het aangegeven getal zitten
if(strlen($split[1]) > MAXDECIMALEN){ // Controleren of het aantal decimalen wat is aangegeven groter is dan de max
echo '<font color="red" face="arial">Je mag maximaal <b>'.MAXDECIMALEN.' decimalen</b> gebruiken, jij gebruikt nu <b>'.strlen($split[1]).' decimalen</b>.</font>';
} else{ // Het aantal decimalen is niet groter dan de max
if(is_numeric($procent) && $procent >= 0 && $procent <= 100){ // Is het procent aantal nummeriek en is het aantal procenten groter of gelijk aan 0 en kleiner of gelijk aan 100?
// Maak de achtergrond afbeelding (125x17)
$afbeelding = imagecreate(BREEDTE, HOOGTE);
// Definieër de kleuren
switch($_GET['stijl']){
case "rood": // Als de aangegeven kleur rood is, maak dan de balk rood
$achtergrond = imagecolorallocate($afbeelding, 125, 0, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 0, 0);
break;
case "geel": // Als de aangegeven kleur geel is, maak dan de balk geel
$achtergrond = imagecolorallocate($afbeelding, 255, 106, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 216, 0);
break;
case "blauw": // Als de aangegeven kleur blauw is, maak dan de balk blauw
$achtergrond = imagecolorallocate($afbeelding, 0, 0, 125);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 0, 255);
break;
case "paars": // Als de aangegeven kleur paars is, maak dan de balk paars
$achtergrond = imagecolorallocate($afbeelding, 33, 0, 127);
$voorkantkleur = imagecolorallocate($afbeelding, 87, 0, 127);
break;
case "rose": // Als de aangegeven kleur rose is, maak dan de balk rose
$achtergrond = imagecolorallocate($afbeelding, 178, 0, 255);
$voorkantkleur = imagecolorallocate($afbeelding, 255, 0, 220);
break;
case "grijs": // Als de aangegeven kleur grijs is, maak dan de balk grijs
$achtergrond = imagecolorallocate($afbeelding, 0, 0, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 64, 64, 64);
break;
case "bruinrood": // Als de aangegeven kleur bruinrood is, maak dan de balk bruinrood
$achtergrond = imagecolorallocate($afbeelding, 91, 63, 60);
$voorkantkleur = imagecolorallocate($afbeelding, 133, 21, 11);
break;
case "turquoise": // Als de aangegeven kleur turquoise is, maak dan de balk turquoise
$achtergrond = imagecolorallocate($afbeelding, 0, 148, 255);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 255, 255);
break;
default: // Als een andere kleur of geen kleur is aangegeven, maak dan de balk standaard groen
$achtergrond = imagecolorallocate($afbeelding, 0, 125, 0);
$voorkantkleur = imagecolorallocate($afbeelding, 0, 255, 0);
break;
}
// Definieër de tekstkleur, en maak deze wit
$tekstkleur = imagecolorallocate($afbeelding, 255, 255, 255);
// Definieër de randkleur en maak deze zwart
$randkleur = imagecolorallocate($afbeelding, 0, 0, 0);
// Definieër de grootte van de voorkant
$grootte = round(($procent/100) * BREEDTE);
// Teken het vierkant op basis van de gegeven procenten
imagefilledrectangle($afbeelding, BORDER, BORDER, $grootte - BORDER - CORRECTIE, HOOGTE - BORDER - CORRECTIE, $voorkantkleur);
// Controleren welke kant de tekst uitgelijnd moet worden
if(ALIGN == 1){ // De tekst moet links uitgelijnd worden
textAlignLeft($afbeelding, $procent . TEKENS, $tekstkleur);
} else if(ALIGN == 3){ // De tekst moet rechts uitgelijnd worden
textAlignRight($afbeelding, $procent . TEKENS, $tekstkleur);
} else{ // De tekst moet gecentreerd worden, ook als er een andere waarde is opgegeven
textAlignCenter($afbeelding, $procent . TEKENS, $tekstkleur);
}
// Teken de rechthoek van de voorkant
imagerectangle($afbeelding, 0, 0, BREEDTE-1, HOOGTE-1, $randkleur);
// Maak een header aan, zodat de browser weet dat dit alleen een image kan bevatten
header('Content-Type: image/png');
// Schrijf het bestand naar de browser
imagepng($afbeelding);
// Verwijder het bestand uit het cache geheugen van de server
imagedestroy($afbeelding);
} else{ // Het aantal procent is niet groter of gelijk aan 0 en kleiner of gelijk aan 100, dus geef een error weer
echo '<font face="arial" color="red">Dit is geen geldig getal, of het getal ligt niet tussen de 0 en 100.</font>';
}
}
// Definieër de functies
function textAlignCenter($image, $string, $color) { // De functie om tekst te centreren
$padding_left = (imagesx($image) - 8 * strlen($string)) / 2; // Bepaal de padding vanaf de linkerkant
$padding_top = (imagesy($image) - 14) / 2; // Bepaal de padding vanaf de bovenkant
$string_split = explode(".", $string); // Verwijder de . uit het aangegeven nummer
if(count($string_split[1]) > 0){ // Controleer of er decimalen zijn
$string = $string_split[0].SCHEIDINGSTEKEN.$string_split[1]; // Ja, ze zijn er dus weergeef het gedefinieërde scheidingsteken en de decimalen erachter
} else{ // Anders...
$string = $string_split[0]; // Er zijn geen decimalen, dus laat de string zo, en geef het gedefinieërde scheidingsteken niet weer
}
imagestring($image, LETTERGROOTTE, $padding_left, $padding_top, $string, $color); // Weergeef de tekst in de afbeelding
}
function textAlignLeft($image, $string, $color) { // De functie om tekst links uit te lijnen
$padding_top = (imagesy($image) - 14) / 2; // Bepaal de padding vanaf de bovenkant
$string_split = explode(".", $string); // Verwijder de . uit het aangegeven nummer
if(count($string_split[1]) > 0){ // Controleer of er decimalen zijn
$string = $string_split[0].SCHEIDINGSTEKEN.$string_split[1]; // Ja, ze zijn er dus weergeef het gedefinieërde scheidingsteken en de decimalen erachter
} else{ // Anders...
$string = $string_split[0]; // Er zijn geen decimalen, dus laat de string zo, en geef het gedefinieërde scheidingsteken niet weer
}
imagestring($image, LETTERGROOTTE, 8, $padding_top, $string, $color); // Weergeef de tekst in de afbeelding
}
function textAlignRight($image, $string, $color) { // De functie om tekst rechts uit te lijnen
$padding_left = (imagesx($image) - 8 * strlen($string)); // Bepaal de padding vanaf de linkerkant
$padding_top = (imagesy($image) - 14) / 2; // Bepaal de padding vanaf de bovenkant
$string_split = explode(".", $string); // Verwijder de . uit het aangegeven nummer
if(count($string_split[1]) > 0){ // Controleer of er decimalen zijn
$string = $string_split[0].SCHEIDINGSTEKEN.$string_split[1]; // Ja, ze zijn er dus weergeef het gedefinieërde scheidingsteken en de decimalen erachter
} else{ // Anders...
$string = $string_split[0]; // Er zijn geen decimalen, dus laat de string zo, en geef het gedefinieërde scheidingsteken niet weer
}
imagestring($image, LETTERGROOTTE, $padding_left, $padding_top, $string, $color); // Weergeef de tekst in de afbeelding
}
?>
Toon Meer
Gedaan:
- Alle variabelen in constanten veranderd
- Constanten netjes uitgelijnd (zie je niet op CP :()
- Bij bijna elke regel (op } na) commentaar toegevoegd
Nieuwe reactie samengevoegd met originele reactie op 31.12.10 10:13:21:
Oja, en nu weet ik waarom dat van iSilverStar niet kon, omdat je een header weergeeft (moet volgens mij en is ook netter) en dan kan je niet ook nog tekst weergeven (zoals bij een criminal) :p:p
Heb je nog geen account? Registreer je nu en word deel van onze community!