Belangrijk: ComputerIdee Forum Huisregels | Wachtwoord vergeten?

Ga terug   Computer Idee Forum > Software > Software Overige

Notices

Antwoord
 
Discussietools Weergave
Oud 3 September 2018, 18:09   #1
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard Php 5 script naar php 7.2

Ik had een scriptje draaien wat goed werkte onder php 5.6.
Maar we hebben geupgrade naar php 5.7.
Het scriptje verzamelt o.a. wat gegevens die mensen kunnen invoeren.

Daarna stuurt het een api aan.

O.a.dit gaat dan mis:
Code:
PHP Notice:  Undefined index: HTTP_REFERER in /home/user/domains/domeinnaam.nl/public_html/config.php on line 61
En op die regel 61 staat dan:
Code:
$_SESSION['referer'] = $_SERVER['HTTP_REFERER'];
het hele stukje is:
Code:
if(!isset($_SESSION['referer'])){

        $_SESSION['referer'] = $_SERVER['HTTP_REFERER'];

}
En werkt dus niet meer in php 7.

En dan nog een soortgelijke:
PHP Notice: Undefined index: location
en die komt hier vandaan (2de regeltje, dus die wat met "if" begint:
Code:
        {
            if ($headers['location'])
            {
                $this->redirectURL = $headers['location'];
                $this->query($headers['location']);
            }
        }
En evt. nog een ander custom regeltje wat ook zo'n notice geeft van Undefined variable.

Wat moet ik hier veranderen zodat dit weer werkt in php 7?
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.

Laatst gewijzigd door BlackTiger : 3 September 2018 om 18:26
BlackTiger is offline   Met citaat antwoorden
Oud 3 September 2018, 19:02   #2
Obelix71
 
Obelix71's schermafbeelding
 
Geregistreerd: 5 June 2005
Berichten: 5.296
Standaard

Over de 1e:
https://stackoverflow.com/questions/...eferer-missing
Als ik het snel lees, bestaat http_referer niet altijd.
Waarom 7 daar, mogelijk, wel over valt en 5 niet? Geen idee.
Obelix71 is offline   Met citaat antwoorden
Oud 3 September 2018, 21:11   #3
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard

Dank je wel alvast voor het meedenken Obelix.
Ik ben ook nog even op zoek gegaan en kwam ergens anders nog een referentie tegen om sessies van http naar https te zetten (to pass).
Misschien heeft het voorheen toch wel een notice gegeven in php 5 nadat ik de site omgezet had van http naar https.

Maar het is mooier als die fouten of in dit geval notices er allemaal uit kunnen, alleen snap ik geen bal van al die code.
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.
BlackTiger is offline   Met citaat antwoorden
Oud 4 September 2018, 18:39   #4
FooBar
 
FooBar's schermafbeelding
 
Geregistreerd: 21 May 2005
Locatie: Elders
Berichten: 14.095
Standaard

Het script werkt, alleen krijg je wat meldingen over variabelen die niet gedeclareerd zijn. Het is niet dat het niet werkt in PHP 7, maar dat de instellingen van PHP anders zijn dan voorheen.

Twee oplossingen:

1) De instelling error_reporting in php.ini wijzigen. Effectief hier & ~E_NOTICE aan toevoegen zou genoeg moeten zijn. Bijvoorbeeld:
Code:
error_reporting=E_ALL & ~E_NOTICE
Dan krijg je alle meldingen, behalve notices. Merk op dat error_reporting twee keer voor komt in php.ini; zoek even naar die tweede, dan krijg je een hele boel uitleg er bij.

2) Je script aanpassen zodat niet-gedeclareerde variabelen wel gedeclareerd worden. Voor die eerste kan dat door door voor regel 61 toe te voegen:
PHP-code:
if (!isset($_SERVER['HTTP_REFERER'])) {
    
$_SERVER['HTTP_REFERER'] = NULL;

Wat dit doet is controleren of $_SERVER['HTTP_REFERER'] bestaat, en zo niet deze aanmaken maar er geen waarde aan toekennen. Daardoor verandert het niet voor de verdere uitwerking van het script.

Die tweede kan ik niet zo veel over zeggen, omdat mij niet duidelijk is wat $headers['location'] zou moeten bevatten. Je kan hetzelfde truukje doen, maar weet niet of dat een gewenst resultaat geeft.

Met andere woorden, ik zou optie 1 eerst proberen

Wat Obelix zegt over dat $_SERVER['HTTP_REFERER'] lang niet altijd wordt ingevuld, dat klopt. Dit is afhankelijk van de browser van de gebruiker en kan helemaal niet door de browser worden doorgegeven. Sowieso als je als eindgebruiker de URL handmatig opgeeft in de adresbalk is deze ook niet ingevuld (er is dan geen doorverwijzing). Normaliter zou het niet erg moeten zijn als deze waarde niet is ingevuld, want dit was met PHP5 ook zo.

Mocht je PHP willen leren, dan kan ik mijn (gratis) boek daarover van harte aanbevelen: http://www.phpboek.net/
FooBar is offline   Met citaat antwoorden
Oud 4 September 2018, 19:42   #5
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard

Ik heb "error_reporting =" nog nooit 2x in een php.ini gezien als instelling.
Wel de term, dus zonder het = teken met dan 3 voorbeelden erbij (Default Value, Development Value en Production Value).
De tweede is met = teken en is de echte instelling. Maar de Notices uitschakelen is slechts een workaround, geen oplossing. Ik heb die graag erbij omdat je dan toch kleine schoonheidsfoutjes kunt oplossen.
Natuurlijk weet ik wel dat je die notices negeren of uitschakelen kunt, maar het is toch (voor mijn gekke brein) rustgevender om te weten dat het perfecter is.

Bij mij staat dat standaard op:
error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

2.) Dat is misschien wel een oplossing, maar ik zie dat jij totaal andere dingen gebruikt. In jouw oplossing staat $_Server terwijl het in mijn voorbeeld om een sessie gaat $_Session, zijn dat niet twee verschillende dingen?

De derde weet je niet precies wat het moet bevatten, misschien maakt het volledige stukje api dit meer duidelijk?
Code:
        // now, if we're being passed a location header, should we follow it?
        if ($this->doFollowLocationHeader)
        {
            if ($headers['location'])
            {
                $this->redirectURL = $headers['location'];
                $this->query($headers['location']);
            }
        }

    }
En ik heb nog zo eentje:
Code:
PHP Notice:  Undefined variable: Betaling in /script/index2.php on line 611
En op regel 611 is het volgende te vinden:
Code:
<option value="overschrijving" <?php if ($Betaling == 'overschrijving') { ?>checked="checked"<?php } ?>>Overschrij
ving</option>
Het gaat hier om een klein bestelscriptje. Wat ik hier vreemd aan vind is dat ie gaat mauwen over deze variabele Betaling, terwijl die een regel hoger ook al is genoemd als volgt:
Code:
<option value="paypal" <?php if ($Betaling == 'paypal') { ?>checked="checked"<?php } ?>>PayPal</option>
Volgens mij heb ik al eens een keer naar je phpboek gekeken. Dat is wel leuk op gezet. Maar om op mijn leeftijd nog php te gaan leren, met al wat ik al doe wordt me denk ik wat teveel van het goede.
Ben ooit eens begonnen met php 3, heb ik hier nog een mooi dik boek van. Maar als ik zie wat er al weer verandert (en weg) is sinds die versie... pfff... dat moet je gaan bijhouden dat php.
Bijhouden doe ik liever met zaken waar ik wat mee van weet, netwerken en linux servers. En met name met ipv6 moet ik nog flink aan de slag, ben ik al wat laat mee.
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.
BlackTiger is offline   Met citaat antwoorden
Oud 4 September 2018, 22:33   #6
FooBar
 
FooBar's schermafbeelding
 
Geregistreerd: 21 May 2005
Locatie: Elders
Berichten: 14.095
Standaard

Citaat:
Ik heb "error_reporting =" nog nooit 2x in een php.ini gezien als instelling.
1x relatief bovenaan onder het kopje "quick reference"
Code:
; error_reporting
;   Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
;   Development Value: E_ALL
;   Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT

En 1x verderop:
Code:
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
; Error handling and logging ;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; This directive informs PHP of which errors, warnings and notices you would like
; it to take action for. The recommended way of setting values for this
; directive is through the use of the error level constants and bitwise
; operators. The error level constants are below here for convenience as well as
; some common settings and their meanings.
; By default, PHP is set to take action on all errors, notices and warnings EXCEPT
; those related to E_NOTICE and E_STRICT, which together cover best practices and
; recommended coding standards in PHP. For performance reasons, this is the
; recommend error reporting setting. Your production server shouldn't be wasting
; resources complaining about best practices and coding standards. That's what
; development servers and development settings are for.
; Note: The php.ini-development file has this setting as E_ALL | E_STRICT. This
; means it pretty much reports everything which is exactly what you want during
; development and early testing.
;
; Error Level Constants:
; E_ALL             - All errors and warnings (includes E_STRICT as of PHP 6.0.0)
; E_ERROR           - fatal run-time errors
; E_RECOVERABLE_ERROR  - almost fatal run-time errors
; E_WARNING         - run-time warnings (non-fatal errors)
; E_PARSE           - compile-time parse errors
; E_NOTICE          - run-time notices (these are warnings which often result
;                     from a bug in your code, but it's possible that it was
;                     intentional (e.g., using an uninitialized variable and
;                     relying on the fact it's automatically initialized to an
;                     empty string)
; E_STRICT          - run-time notices, enable to have PHP suggest changes
;                     to your code which will ensure the best interoperability
;                     and forward compatibility of your code
; E_CORE_ERROR      - fatal errors that occur during PHP's initial startup
; E_CORE_WARNING    - warnings (non-fatal errors) that occur during PHP's
;                     initial startup
; E_COMPILE_ERROR   - fatal compile-time errors
; E_COMPILE_WARNING - compile-time warnings (non-fatal errors)
; E_USER_ERROR      - user-generated error message
; E_USER_WARNING    - user-generated warning message
; E_USER_NOTICE     - user-generated notice message
; E_DEPRECATED      - warn about code that will not work in future versions
;                     of PHP
; E_USER_DEPRECATED - user-generated deprecation warnings
;
; Common Values:
;   E_ALL (Show all errors, warnings and notices including coding standards.)
;   E_ALL & ~E_NOTICE  (Show all errors, except for notices)
;   E_ALL & ~E_NOTICE & ~E_STRICT  (Show all errors, except for notices and coding standards warnings.)
;   E_COMPILE_ERROR|E_RECOVERABLE_ERROR|E_ERROR|E_CORE_ERROR  (Show only errors)
; Default Value: E_ALL & ~E_NOTICE & ~E_STRICT & ~E_DEPRECATED
; Development Value: E_ALL
; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
; http://php.net/error-reporting
error_reporting=E_ALL & ~E_NOTICE

Citaat:
In jouw oplossing staat $_Server terwijl het in mijn voorbeeld om een sessie gaat $_Session, zijn dat niet twee verschillende dingen?
Klopt, maar de eerste foutmelding gaat over "Undefined index: HTTP_REFERER". Dat zegt dus zoveel als dat $_SERVER['HTTP_REFERER'] niet bestaat. ('HTTP_REFERER' is een index in de array $_SERVER). Om daar van af te komen, moet je er dus voor zorgen dat deze dus in alle gevallen wel gaat bestaan. De code die ik gaf kijkt of de variabele bestaat. Zo niet, dan kent hij er een null-waarde aan toe. Dan bestaat hij wel, maar staat er niks in. Daarmee zal die eerste notice dus weg gaan.

Citaat:
De derde weet je niet precies wat het moet bevatten, misschien maakt het volledige stukje api dit meer duidelijk?
Klein beetje. Hieruit is nog niet te zien waar $headers['location'] precies vandaan komt, maar het lijkt voor het script niet erg te zijn als het niet bestaat.

Als je if ($headers['location']) wijzigt in if (!empty($headers['location'])) zou je er moeten zijn wat betreft deze notice.

Citaat:
En ik heb nog zo eentje:
Hier zou ik voor het gemak voor regel 610 even het volgende toevoegen"
PHP-code:
<?php if (!isset($Betaling)) $Betaling null?>
Da's niet helemaal netjes (want je zou dit eigenlijk ergens anders in het script moeten oplossen), maar daarmee ben je wel van het probleem af gok ik.
Hoewel, er kan nog iets anders aan de hand zijn. Zonder het heel ingewikkeld te maken. Het zou iets met register_globals kunnen zijn. In dat geval moet ook nog eens $Betaling vervangen worden door $_POST['Betaling'] (of $_GET['Betaling'] als het formulier niet gepost wordt; in dat geval zie je de hele invoer in de URL terug, dus daar is snel achter te komen).

Citaat:
Maar om op mijn leeftijd nog php te gaan leren, met al wat ik al doe wordt me denk ik wat teveel van het goede.
Da's uiteraard volledig aan jou. Geen verplichting
FooBar is offline   Met citaat antwoorden
Oud 4 September 2018, 23:30   #7
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard

Citaat:
1x relatief bovenaan onder het kopje "quick reference"
Dat is alleen de term, geen waarde, hoef je ook niet aan te passen, dat beschreef ik ook in mijn tekst.
Citaat:
Oorspronkelijk geplaatst door Black Tiger
Wel de term, dus zonder het = teken met dan 3 voorbeelden erbij (Default Value, Development Value en Production Value).
De waarde (met = teken) staat er maar 1x in, dus maar 1x aanpassen nodig. Dat is die wat verderop staat, die grote quote wat je gaf.

Citaat:
Oorspronkelijk geplaatst door Foobar
Dan bestaat hij wel, maar staat er niks in. Daarmee zal die eerste notice dus weg gaan.
Oke dat begrijp ik voor zover. Maar je schreef dat ik hem op regel 61 moest zetten en daar staat dat met $_Session, dan overschrijf ik dat toch daarmee? Of moet ik dat erbij zetten? Of erboven of waar?

Citaat:
Oorspronkelijk geplaatst door Foobar
Het zou iets met register_globals kunnen zijn.
Daar zeg je zoiets. Weet ik niet. In php 5.6 stond register_globals aan terwijl hij in 5.4.0 removed zou zijn las ik op php.net. In elk geval kon ik hem wel nog in de php.ini terugvinden. Als mijn geheugen goed is.
Nu staat hij in elk geval niet meer in de php.ini van 7.2 dus misschien heeft het inderdaad daar iets mee te maken.
Maar misschien ook met het volgende.
Dat van die $Betaling is een keuze waarde, normaliter ziet men een pulldown en dan kan men kiezen voor Mollie, Paypal of Overschrijving. Ik heb in de config de optie voor Mollie en Paypal op 0 gezet zodat alleen de keuze Overschrijving zichtbaar en selecteerbaar is.
Misschien dat de notice daardoor ontstaan is?

Edit: Het wijzigen van if ($headers['location']) wijzigt in if (!empty($headers['location'])) heeft inderdaad een notice weggehaald.
Zo te zien is het nu alleen nog die variabele van Betaling want de $Session_referer notice is opeens weg.

Ik post even het hele stukje, dan zie je misschien beter of het aan die register_globals of iets anders ligt.

Code:
                <?php
                                if ($NoPay != 1) {
                                        ?>
                   <img src="images/information.png" onmouseover="infoOVER('Hier geeft u aan welke betalingsmethode u gaat gebruiken.')
;" onmouseout="infoOUT();" alt="" /> Betaling*:<br />
                <select name="Betaling">
                  <?php if( $Paypal == 1) { ?>
                  <option value="paypal" <?php if ($Betaling == 'paypal') { ?>checked="checked"<?php } ?>>PayPal</option>
                  <?php } ?>
                  <?php if( $BANK == 1) { ?>
                  <option value="overschrijving" <?php if ($Betaling == 'overschrijving') { ?>checked="checked"<?php } ?>>Overschrij
ving</option>
                  <?php } ?>
                  <?php if( $MOLLIE == 1) { ?>
                  <option value="mollie" <?php if ($Betaling == 'mollie') { ?>checked="checked"<?php } ?>>iDeal Mollie</option>
                  <?php } ?>
                </select>
                <?php

                                }
                                ?>
                <input type="hidden" name="step" value="<?php echo $Step; ?>" /></td>
            </tr>
            <tr>
              <td colspan="2" align="center"><input type="button" name="FormSelectBack" value="Vorige" onclick="history.go(-1)"/>
                <input type="submit" name="FormSelectSubmit" value="Verder" />
              </td>
            </tr>
          </table>
          </span>
        </form>
        <?php
Een stuk hoger vond ik nog deze:
Code:
$Betaling = addslashes($_POST['betaling']);
tussen de declaraties. Hopelijk is deze in orde zo of heeft het misschien hiermee te maken? Moet ie anders?
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.

Laatst gewijzigd door BlackTiger : 4 September 2018 om 23:57
BlackTiger is offline   Met citaat antwoorden
Oud 5 September 2018, 18:24   #8
FooBar
 
FooBar's schermafbeelding
 
Geregistreerd: 21 May 2005
Locatie: Elders
Berichten: 14.095
Standaard

Citaat:
Oorspronkelijk geplaatst door BlackTiger Bekijk bericht
Dat is alleen de term, geen waarde, hoef je ook niet aan te passen, dat beschreef ik ook in mijn tekst.

De waarde (met = teken) staat er maar 1x in, dus maar 1x aanpassen nodig. Dat is die wat verderop staat, die grote quote wat je gaf.
Ok, ik heb het misschien wat onhandig opgeschreven, maar we bedoelen hetzelfde. Inderdaad maar 1x aanpassen en dan inderdaad die wat verderop staat met =teken

Citaat:
Oke dat begrijp ik voor zover. Maar je schreef dat ik hem op regel 61 moest zetten en daar staat dat met $_Session, dan overschrijf ik dat toch daarmee? Of moet ik dat erbij zetten? Of erboven of waar?
Nee, voor regel 61. Dus niks overschrijven, maar toevoegen. En dat dan na regel 60 en voor regel 61 door daar zo veel als nodig nieuwe regels toe te voegen.

Citaat:
Daar zeg je zoiets. Weet ik niet. In php 5.6 stond register_globals aan terwijl hij in 5.4.0 removed zou zijn las ik op php.net. In elk geval kon ik hem wel nog in de php.ini terugvinden. Als mijn geheugen goed is.
Nu staat hij in elk geval niet meer in de php.ini van 7.2 dus misschien heeft het inderdaad daar iets mee te maken.
Als je PHP 5.6 hiervoor had, zal dit het niet zijn. Dat het in php.ini stond kan een overblijfsel zijn van een vorige versie van PHP.

Citaat:
Dat van die $Betaling is een keuze waarde, normaliter ziet men een pulldown en dan kan men kiezen voor Mollie, Paypal of Overschrijving. Ik heb in de config de optie voor Mollie en Paypal op 0 gezet zodat alleen de keuze Overschrijving zichtbaar en selecteerbaar is.
Misschien dat de notice daardoor ontstaan is?
Dat verwacht ik niet. Het ziet er uit dat $Betaling pas wordt ingevuld als het formulier wordt verzonden. Het wordt gebruikt om de formulierelementen juist in te stellen als het formulier niet goed is ingevuld. Zodat je niet alles wat je wel goed had ingevuld opnieuw moet gaan invullen. Dus als je de eerste keer het formulier opent bestaat $Betaling niet en daar komt die notice dan van.

Citaat:
$Betaling = addslashes($_POST['betaling']);
Deze lekker laten staan.
FooBar is offline   Met citaat antwoorden
Oud 5 September 2018, 19:01   #9
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard

Ah sjips.
Ik moet een boel weer terug gaan zetten, na een of andere verandering wenst het script opeens niet meer tot het einde te gaan, bij de laatste verzending gaat het mis.
Dus het wordt even zoeken wat het probleem is en dan stuk voor stuk opnieuw beginnen anders die notices maar laten staan.

Misschien kun je me wel nog bij deze helpen, die blijft toch terug komen, is een notice maar die stoort me wel echt:
"A non well formed numeric value encountered"
en die verwijst dan hier naar:
Code:
 $_SESSION['cod'] = substr(md5(rand(000, 999) * md5(rand(000, 999))), 1, 5);
Misschien is dat met een kleine aanpassing te fixen.

Toch in elk geval alvast zover bedankt voor de hulp, dan kan ik het met jouw tips gewoon regeltje voor regeltje proberen.
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.
BlackTiger is offline   Met citaat antwoorden
Oud 5 September 2018, 19:14   #10
BlackTiger
 
BlackTiger's schermafbeelding
 
Geregistreerd: 4 May 2005
Locatie: State Penitentiary
Berichten: 11.171
Standaard

Ah denk dat ik een fout gevonden heb. Na alles teruggezet te hebben en dan deze wijziging:
Code:
if ($headers['location']) wijzigt in if (!empty($headers['location']))
Dan krijg ik:
Code:
PHP Fatal error:  Uncaught Error: Call to undefined function emtpy()
Ik denk dat ik die notices dan toch maar voor lief neem, dan werkt het script tenminste.
Maar als je nog iets weet voor die "non well formed numeric value" zou ik toch nog wel fijn vinden.
__________________
Greetings, Black Tiger

-----------------------------
Domme vragen bestaan niet. Het is dom om een vraag te hebben en deze niet te stellen.
BlackTiger is offline   Met citaat antwoorden
Antwoord

Discussietools
Weergave

Regels voor berichten
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is Aan
Smileys zijn Aan
[IMG]-code is Aan
HTML-code is Uit

Forumnavigatie


Alle tijden zijn GMT +1. Het is nu 20:39.


Powered by vBulletin Version 3.8.6
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.