Avatar billede tras Juniormester
30. august 2016 - 15:43 Der er 13 kommentarer og
1 løsning

Efter opdatering af php 5,6 til 7.0 virker min mysql connection ikke!

<?
class DB{
    function Conn($action){
        $link = mysql_connect("xxx.dk.mysql", "usernamexxx", "passwordxxx");
        if($action == "open"){
            if(!$link){
                die("Could not Connect ==> ".mysql_error);
            }else{
                mysql_select_db("databasexxx");
            }
        }elseif($action == "close"){
            mysql_close($link);
        }
    }
}
DB::Conn("open");   

// Get data from database.
$SQL = "SELECT * FROM dgk_links LIMIT 9";
$loadin = mysql_query($SQL) or die("mySQL ERROR:".mysql_error);
while ($Get = mysql_fetch_object($loadin)){
echo '<li><a target="new" href="'.$Get->link.'">'.utf8_encode($Get->name).'</a></li>';

}

?>
Avatar billede michael_stim Ekspert
30. august 2016 - 15:51 #1
Du skal bruge mysqli. Altså i til sidst.
Avatar billede michael_stim Ekspert
30. august 2016 - 15:52 #2
Og det skal du gøre overalt hvor du har brugt mysql :-(
Avatar billede michael_stim Ekspert
30. august 2016 - 15:54 #3
Avatar billede olsensweb.dk Ekspert
30. august 2016 - 15:57 #4
som michael_stim skriver skal du anvende mysqli eller PDO, da det gamle mysql API er fjernet i php7

ref http://php.net/mysql_connect

Warning
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information. Alternatives to this function include:


så opdater din code
Avatar billede olsensweb.dk Ekspert
30. august 2016 - 16:45 #5
i mysqli og PDO skal du angive navnet på din connection, hvor du ikke behøvede det i det gamle API da connection blev lagt som en super global

din code omskrevet, kun se ca sådan ud (utested)

<?php
class DB{
    function Conn($action){
        //$link = new mysqli("xxx.dk.mysql", "usernamexxx", "passwordxxx", "databasexxx");
        $link = mysqli_connect("xxx.dk.mysql", "usernamexxx", "passwordxxx", "databasexxx");
        if($action == "open"){
            if(!$link){
                //die("Could not Connect ==> ".$link->error );
                die("Could not Connect ==> ".mysqli_error($link) );
            }else{
                reurn $link;
            }
        }elseif($action == "close"){
            mysql_close($link);
        }
    }
}


$link = DB::Conn("open");   

// Get data from database.
$SQL = "SELECT * FROM dgk_links LIMIT 9";
//$loadin = $link->query($SQL) or die("mySQL ERROR:".$link->error );
$loadin = mysqli_query($link,$SQL) or die("mySQL ERROR:".mysqli_error($link) );
// while ($Get = $loadin->fetch_object()){
while ($Get = mysqli_fetch_object($loadin)){
echo '<li><a target="new" href="'.$Get->link.'">'.utf8_encode($Get->name).'</a></li>';

}
?>


jeg har skrevet det procedural style, så du kan se hvor meget det ligner det gamle, og i OOP style (udkommenteret), som er dagens standart, så opdater din code og anvendt OOP style.

****************
i mysqli kan man skrive i 2 styles:
procedural style: som du kender fra det gamle mysql, der er grundlæggende bare tilføjet et i, i alle mysql_ kommandoerne så de hedder mysqli_, og ved mange af dem skal du også angive din connection

OOP style: dette er det der anvendes mest, og er fremtiden

Prepare Statement: er noget af det nye der er kommet til i mysqli, en kvik guide lå tidligere her http://www.eksperten.dk/guide/1480
du har kun numbered place holders

guiden kan nu findes på http://archive.org/web/
indtast www.eksperten.dk/guide/1480 i søge feltet
vælg sidst gemte dato her april 13, 2016
*************
PDO: dette ser jeg som det fremtidige ext (API), du kan kun anvende OOP style, tilgengæld har du alle fordele fra ODBC men ikke ulemperne ved at skulle installerer en system driver
PDO anvender også en extern driver men PHP har de mest anvendte indbygget. (skal evt enables i php.ini)

Prepare Statement: er klart forbedret i forhold til mysqli
du har numbered placeholders og named placeholders, sidst nævnte er klart nemmere at læse IMHO
*****************

overvej at anvende Prepare Statement som er noget af det nye der er kommet til i mysqli og forbedret i PDO
Avatar billede tras Juniormester
30. august 2016 - 23:04 #6
Tak ronols dit fik jeg til at virke :)

nu har jeg læst nogle af siderne igennem men kan ikke få mit insert til at virke, kan du se dig ud af det hurtig?

$date = date("Y-m-d H:i:s");
$name = addslashes(htmlspecialchars($_POST['name']));
$email = addslashes(htmlspecialchars($_POST['email']));
$message = addslashes(htmlspecialchars($_POST['message']));
                           
// Data to Database
mysqli_set_charset('utf8');
mysqli_query("INSERT INTO dgk_kontakt (
                                date,
                                name,
                                email,
                                message
) VALUES (
                                '$date',
                                '$name',
                                '$email',
                                '$message'
)") or die (Java::Alert("MySQL Error: ".mysqli_error()));
Avatar billede arne_v Ekspert
31. august 2016 - 02:03 #7
Det var lidt nemmere at finde problemet hvis du fortalte hvilken fejl besked du faar.

:-)
Avatar billede arne_v Ekspert
31. august 2016 - 02:21 #8
addslashes og htmlspecialchars boer ikke kaldes paa input - i.s.f. skal der bruges prepare og parameters ved INSERT. Og evt. skal der bruges htmlspecialchars, naar data skal vises igen.

Men det boer ikke give fejl.

DATE og NAME er begge keywords og derfor daarlige valg som feltnavne, men tilsyneladende ikke reserveret.

Saa det boer heller ikke give fejl.
Avatar billede arne_v Ekspert
31. august 2016 - 02:23 #9
Men baade mysqli_set_charset og mysqli_query mangler connection som argument !

Det maa vaere det som giver fejlen.
Avatar billede tras Juniormester
31. august 2016 - 08:34 #10
Så virker det med insert med den fucker æøå, har brugt denne men den virker så ikke mysqli_set_charset('utf8');

$sql = "INSERT INTO dgk_kontakt (
                                date,
                                name,
                                email,
                                message
                            ) VALUES (
                                '$date',
                                '$name',
                                '$email',
                                '$message')";
                                mysqli_set_charset('utf8');
                            if (mysqli_query($link, $sql)) {
                                echo 'Tak '.$name.', dine besked er modtaget og vil blive besvaret hurtigst muligt.';
                            } else {
                                echo "Error: " . $sql . "<br>" . mysqli_error($conn);
                            }
Avatar billede olsensweb.dk Ekspert
31. august 2016 - 09:28 #11
@tras
du kunne svare på #7 hvis du havde slået display error, og error_reporting til, hvilke du altid bør have under udvikling

som arne_v skriver mangler du også at angive din connection i  mysqli_set_charset('utf8');
skal se sådan ud:  mysqli_set_charset($link,'utf8');

jeg ville iøvrigt ligge  mysqli_set_charset('utf8'); op i class DB, så hver gang du laver en connection anvender du utf-8.


class DB{
    function Conn($action){
        //$link = new mysqli("xxx.dk.mysql", "usernamexxx", "passwordxxx", "databasexxx");
        $link = mysqli_connect("xxx.dk.mysql", "usernamexxx", "passwordxxx", "databasexxx");
        if($action == "open"){
            if(!$link){
                //die("Could not Connect ==> ".$link->error );
                die("Could not Connect ==> ".mysqli_error($link) );
            }else{
                //$link->set_charset("utf8");
                mysqli_set_charset($link,'utf8');           
                reurn $link;
            }
        }elseif($action == "close"){
            mysqli_close($link);
        }
    }
}


din elseif kan du godt slette da den ikke giver nogle mening, da du/jeg har retuneret connection.

nb jeg ville ikke kalde min connenction for link, da jeg a og til har et felt navn der også hedder link, og så kunne et være man kom til at lave en variabel der også hedder link, og smadre derved sin connection


dette vil gå galt

$sql = "select link from tbl";
$rs = mysqli_query($link,$sql) or die("mySQL ERROR:".mysqli_error($link) );
//while ($row = $rs->fetch_assoc()){
while ($row = mysqli_fetch_assoc($rs)){
    $link = $row['link']; // her smadre jeg lige min connection
}


din insert vil være et oplagt eks på et sted der skal omskrives til Prepare Statement
Avatar billede peters Praktikant
05. september 2016 - 10:33 #12
På et eksisterende projekt kan du med fordel benytte dette værktøj https://github.com/philip/MySQLConverterTool til automatisk at konvertere alle dine projekt filer fra php5 til php7. Det er benyttet på flere projekter med store success.
Avatar billede arne_v Ekspert
05. september 2016 - 16:40 #13
To bemaerkninger til dette vaerktoej:

1) Den konverterer mysql extension brug til mysqli extension brug procedural style med brug for mysqli_real_escape_string ikke prepare. Det er ikke den rigtige vej fremad paa laengere sigt.

2) Den genererede fejl haandtering er noget snasket kode.
Avatar billede arne_v Ekspert
05. september 2016 - 17:37 #14
Med hensyn til brug af prepared statement, saa er der en database ved navn H2 til Java. Det er en database ligesom SQLite og paa mange omraader ret triviel, men den har en genial feature.

Man tilfoejer ;ALLOW_LITERALS=NONE til connection string og saa faar man en exception hvis man forsoeger at bruge vaerdier direkte udenom prepared statement.
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
Kategori
Computerworld tilbyder specialiserede kurser i database-management

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