Avatar billede Fiber Bjørn Juniormester
24. februar 2015 - 12:23 Der er 7 kommentarer

mysqli_connect

Jeg er ved at lave om til mysqli_connect fra gammel til ny måde.
Er dette den rigtige måde at gøre det på.

Gammel måde:

//MySQL information

$host = "host";
$user = "user";
$pass = "pass";
$database = "fikskekasser";
function connect()
{
global $host;
global $user;
global $pass;
global $database;
mysql_connect($host, $user, $pass);
mysql_select_db($database);



Ny måde:

congfig.php - Start *******************
<?
$conn = mysqli_connect("host", "user", "pass", "database");
if (!$conn) {
    echo 'Der opstod en fejl.';
    exit();
}
mysqli_set_charset($conn, "utf8");

// sætter navne til dansk
$sql = "SET lc_time_names = 'da_DK'";
$query = $conn->query($sql);
?>
congfig.php - Slut *******************


udskrive fra database:

<?
require("config.php");

$sql = "select * from fiskekasser order by fisk";
$query = $conn->query($sql);

$str="<table>";
while($row = $query->fetch_assoc()){
  $str .= "<tr>";
    $str .= "<td>". $row['fisk'] ."</td>";     
  $str .= "</tr>";       
}
$str .="</table>";
echo $str;
?>
Avatar billede jakobdo Ekspert
24. februar 2015 - 13:37 #1
Virker det ? :o)

Hvis ja, så ser det korrekt ud.
Hvis nej, så er det ikke. :o)

Du bør overveje prepare, når/hvis du modtager inputs fra brugeren eller url.

f.eks. SELECT * FROM noget WHERE id = $_GET['id']
http://dk.php.net/mysqli_prepare
Avatar billede Fiber Bjørn Juniormester
24. februar 2015 - 13:46 #2
#1
Det virker :)
Så det er jo godt nok.


Jeg var faktisk også ved at skulle skrive et spørgsmål til.
Det jeg har brugt før i tiden er dette:

$email = mysql_real_escape_string($_POST["email"]);
$kode = mysql_real_escape_string($_POST["kode"]);

til f.eks login og andre indtastninger.
Men det er jo så det om det er tidssvarrende ????
Avatar billede jakobdo Ekspert
24. februar 2015 - 13:54 #3
Der skal du netop bruge prepare.
Så slipper du helt for mysql_real_escape_string.

Din kode kunne så ligne noget ala dette:
if ($stmt = $mysqli->prepare("SELECT username FROM users WHERE email=? and kode=?")) {
    $stmt->bind_param("ss", $_POST['email'], $_POST['kode']);
    $stmt->execute();
    $stmt->bind_result($username);
    $stmt->fetch();
    echo $username;
    $stmt->close();
}
Avatar billede olsensweb.dk Ekspert
24. februar 2015 - 14:12 #4
som jakobdo skriver kan du md fordel anvende Prepare statement, afh sikkerhed, og du kan undvære real-escape-string
hvis du vil kaste dig ud i prepare statement, kan du med fordel læse olebole's guide http://www.eksperten.dk/guide/1480

hvis du stadig vil holde fast i den gamle måde at skrive det på, er syntaxen for real-escape-string som du kender den
http://php.net/manual/en/mysqli.real-escape-string.php

// Procedural style, her er bare tilføjet en connection, og navnet ændret med en tilføjelse af et i
$city = mysqli_real_escape_string($conn, $city);
eller hvis du vil anvende OOP

// Object oriented style
$city = $mysqli->real_escape_string($city);

og ja du kan sagtens blande OOP style og Procedural style, men OOP style vil nok på sigt udkonkurrere Procedural style
Avatar billede Fiber Bjørn Juniormester
24. februar 2015 - 14:31 #5
#3

F.... jeg er på glat is...
Når jeg prøver lige at forstå.

Finder bruger og password der passer sammen:
if ($stmt = $mysqli->prepare("SELECT username FROM users WHERE email=? and kode=?")) {

- Er jeg ikke lige klar over hvad det gør:
$stmt->bind_param("ss", $_POST['email'], $_POST['kode']);

- Er jeg ikke lige klar over hvad det gør:
$stmt->execute();

Henter resultatet af hvilken bruger info stemmer over ens med.
$stmt->bind_result($username);

Starter udskrivningen af fundet data:
$stmt->fetch();

Udskriver data:
echo $username;

Lukker løkken igen på fundet data:
$stmt->close();

kan du hjælpe med forståelsen???



**************

Jeg ville jo ud fra dette kunne forrestille mig at det kunne skrives om til dette.

if ($stmt = $mysqli->prepare("SELECT fornavn, efternavn FROM users WHERE fornavn='$_POST[fornavn]'")) {
    $stmt->bind_param("ss", $_POST['fornavn']);
    $stmt->execute();
    $stmt->bind_result($username, $efternavn);
   
echo " <table>";

    $stmt->fetch();
    echo " <tr>";
    echo " <td>".$username; $efternavn.":</td>";
    echo " </tr>";
    $stmt->close();

echo " </table>";
}


Udskrevet:

Steffen Andersen
Steffen Petersen
Avatar billede Fiber Bjørn Juniormester
24. februar 2015 - 14:35 #6
#4

Ja det er det jeg er lidt bange for.
Som jeg lige har skrevet er der lidt at jeg ikke forstår.

Men jeg vil jo også godt have det lavet på den bedste måde :)
Avatar billede olsensweb.dk Ekspert
24. februar 2015 - 15:29 #7
du er i nærheden af det du ønsker
kig på denne

database
     
--
-- Database: `test`
--

-- --------------------------------------------------------

--
-- Struktur-dump for tabellen `tbl_1001981`
--

CREATE TABLE IF NOT EXISTS `tbl_1001981` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `fornavn` varchar(25) COLLATE utf8_danish_ci NOT NULL,
  `efternavn` varchar(25) COLLATE utf8_danish_ci NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=5 ;

--
-- Data dump for tabellen `tbl_1001981`
--

INSERT INTO `tbl_1001981` (`id`, `fornavn`, `efternavn`) VALUES
(1, 'Steffen', 'Andersen'),
(2, 'Jakob', 'Olsen'),
(3, 'Steffen', 'Petersen'),
(4, 'Ronny', 'Olsen');


php fil
     
<?php
function MySqlIConnOOP($db = "", $username = "", $password = "", $hostname = "") {
    $db = ($db == "") ? "test" : $db;
    $hostname = ($hostname == "") ? "localhost" : $hostname;
    $username = ($username == "") ? "root" : $username;
    $password = ($password == "") ? "" : $password;
    $conn = new mysqli($hostname, $username, $password, $db);
    /* check connection */
    if (!$conn) {
        echo 'Der opstod en fejl.';
        exit();
    }
    $conn->set_charset("utf8");
    return $conn;
}

$mysqli = MySqlIConnOOP();
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>demo</title>
    </head>
    <body>
        <?php
        if (isset($_POST['fornavn'])) {
            if ($stmt = $mysqli->prepare("SELECT fornavn, efternavn FROM tbl_1001981 WHERE fornavn=?")) {
                $stmt->bind_param("s", $_POST['fornavn']);
                $stmt->execute();
                $stmt->bind_result($fornavn, $efternavn);

                echo " <table>";
                while ($stmt->fetch()) {
                    echo " <tr>";
                    echo " <td>" . $fornavn . " " . $efternavn . "</td>";
                    echo " </tr>";
                }
                $stmt->close();
                echo " </table>";
            }
        }
        ?>
        <form method="post">
            <input type="text" name="fornavn">
            <input type="submit">
        </form>
    </body>
</html>

hvis du indtaster Steffen får du udskrevet 2 personer
hvis du indtaster ronny eller jakob får du udskrevet 1 person


Personlig er jeg ikke til mysqli men foretrækker PDO, men tankegangen omkring Prepare Statement er den sammen, dog klart forbedret
i PDO kan du KUN anvende OOP style
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