Avatar billede thomashoeg Novice
12. september 2016 - 22:50 Der er 8 kommentarer og
1 løsning

Udfordring med PHP7 og functions

Hej alle

Min server er netop opdateret til PHP7. Det bevirker at en af de funktioner jeg havde i min PHP kode ikke længere fungerer.

Koden ser således ud:
function displayEntry($centerID) {
       
        // GET SOLCENTER DATA
       
            $result = mysqli_query($connection,"SELECT name, address, postal, city, urlkey, kaede, lat, lon FROM solcentre WHERE id='" . $centerID . "'");
                while ($row = mysqli_fetch_array($result)) {
                $centerName         = $row[name];
                $centerAddress     = $row[address];
                $centerPostal     = $row[postal];
                $centerCity         = $row[city];
                $centerUrlKey     = $row[urlkey];
                $centerKaede     = $row[kaede];
                $centerLat         = $row[lat];
                $centerLon         = $row[lon];
[....]
}}

Den giver den fejl:
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in /var/www/minsol.dk/public_html/include/functions.php on line 17

Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result, null given in /var/www/minsol.dk/public_html/include/functions.php on line 18

På denne URL (scroll lidt ned):
http://minsol.dk/center/aakirkeby-solcenter-aakirkeby-244

Jeg mistænker lidt at det er denne del af koden af det er galt med:
function displayEntry($centerID) {

Venlig hilsen
Thomas
Avatar billede olsensweb.dk Ekspert
12. september 2016 - 23:08 #1
du får ikke overført din connection til din function (scope)


function displayEntry($centerID) {
skal have functionen med som parameter
function displayEntry(connection, $centerID) {


alternativ erklærer den som global inde i functionen.

nb: brugen af global er ugle set af mange, herunder mig
Avatar billede arne_v Ekspert
13. september 2016 - 01:59 #2
Jeg forstaar ikke at nogen skifter fra mysql til mysqli og fortsaetter med at saette vaerdier i SQL via streng konkatanering.

Der er en grund til mysqli har erstattet mysql.

At skifte fra mysql til mysqli ved at aendre funktions prefix fra 'mysql_' til 'mysqli_' svarer til at bringe sin bil ind paa vaerkstedet med en blinkende lampe p.g.a. manglende bremsevaeske og bede dem fjerne paeren i lampen for at slippe for det blinkeri.

:-)
Avatar billede thomashoeg Novice
13. september 2016 - 06:39 #3
@ronols

Har forsøgt, at sætte min $connection variabel ind som:
function displayEntry($connection, $centerID) {

Men tilsyneladende får jeg bare en ny fejl (http://minsol.dk/center/aakirkeby-solcenter-aakirkeby-244). Kan det være en mangel i selve kaldet på funktionen? Kalder den via:

displayEntry($centerID)

@arne_v

Det er vist mere pga af manglende viden indenfor mysqli :-)
Avatar billede olsensweb.dk Ekspert
13. september 2016 - 08:46 #4
>Kalder den via:
>displayEntry($centerID)
her skal du selvføgelig også angive din mysqli connection, antallet af parameter til functionen skal passe
så der skal stå
displayEntry($mysqli, $centerID)
antager din connection hedder $mysqli

hvis din connection hedder noget andet så er det det der skal stå der
feks
displayEntry($connection, $centerID)

kig i linjen
$mysqli = mysqli_connect("localhost", "root", "", $db);
hvad din connection hedder (fremhævet)


det som arne_v hentyder til er at du ikke anvender Prepare Statement, som er noget af det nye der er kommet til i mysqli er du kan anvende Prepare Statement, hvilke giver størrer sikkerhed, samt at du forsat skriver i procedural style, dagens standart er OOP style
Avatar billede olsensweb.dk Ekspert
13. september 2016 - 08:51 #5
lidt bedre formuleret
det som arne_v hentyder til er at du ikke anvender Prepare Statement, som er noget af det nye der er kommet til i mysqli, hvilke giver størrer sikkerhed, samt at du forsat skriver i procedural style, dagens standart er OOP style

her ville det være rart at kunne redigerer sine indlæg, som man kan på http://www.udvikleren.dk/
Avatar billede arne_v Ekspert
13. september 2016 - 17:34 #6
At skifte fra streng konkatanering til prepare og parameters er vigtigt. Jeg betragter det som langt vigtigere end at skifte fra procedural til OO stil.
Avatar billede thomashoeg Novice
17. september 2016 - 21:36 #7
@ronols

Beklager den sene feedback ? og tusind tak for tippet.

Jeg kan dog stadig ikke få det til at fungere korrekt. Pt. ser min kode således ud:
http://take.ms/bPbZ9

Og jeg har får stadig fejl på siden:
http://minsol.dk/center/jungle-sun-horsens-450 (scroll lidt ned)

Er sikkert bare en eller anden lille fejl jeg har lavet i koden.
Avatar billede olsensweb.dk Ekspert
17. september 2016 - 23:32 #8
som jeg skrev i 1, 2 løsninger

løsning 1 med global (ikke anbefalet, men hvis der er rigtig mange kald til functionen kan det være en nødløsning)

function displayEntry($centerID) {
    global $connection; // denne variabel SKAL hedder det sammen som uden for functionen   
        // GET SOLCENTER DATA
       
            $result = mysqli_query($connection,"SELECT name, address, postal, city, urlkey, kaede, lat, lon FROM solcentre WHERE id='" . $centerID . "'");
                while ($row = mysqli_fetch_array($result)) {
                $centerName        = $row[name];
                $centerAddress    = $row[address];
                $centerPostal    = $row[postal];
                $centerCity        = $row[city];
                $centerUrlKey    = $row[urlkey];
                $centerKaede    = $row[kaede];
                $centerLat        = $row[lat];
                $centerLon        = $row[lon];
[....]
}}

eks på kald displayEntry($centerID); // her er der intet nyt
connection kunne se sådan ud
$connection = mysqli_connect("localhost", "root", "", $db);


løsning 2 (anbefalet)

function displayEntry($connection, $centerID) {   
        // GET SOLCENTER DATA
       
            $result = mysqli_query($connection,"SELECT name, address, postal, city, urlkey, kaede, lat, lon FROM solcentre WHERE id='" . $centerID . "'");
                while ($row = mysqli_fetch_array($result)) {
                $centerName        = $row[name];
                $centerAddress    = $row[address];
                $centerPostal    = $row[postal];
                $centerCity        = $row[city];
                $centerUrlKey    = $row[urlkey];
                $centerKaede    = $row[kaede];
                $centerLat        = $row[lat];
                $centerLon        = $row[lon];
[....]
}}

eks på kald displayEntry($mysqli, $centerID); // her SKAL rettes alle steder du kalder functionen

connection kunne se sådan ud
$mysqli = mysqli_connect("localhost", "root", "", $db);
Avatar billede thomashoeg Novice
18. september 2016 - 20:55 #9
Tak for det.

Fik aldrig løsning 1 til at virke ? men da kaldene ind i funktionen blot er fordelt på 5-7 sider, så er ændringen i koden minimal ? og derfor er løsning 2 helt fin.

Tusind tak for hjælpen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester