Avatar billede bqnke Nybegynder
29. december 2015 - 16:14 Der er 10 kommentarer og
1 løsning

Warning: mysqli::mysqli() expects parameter 1 to be string,

Jeg for følgende fejlmeddelser kan i fortælle mig hvad jeg gør galt ?

Warning: mysqli::mysqli() expects parameter 1 to be string, object given in /var/www/hold-ud.dk/public_html/katinka/header.php on line 14

Warning: mysqli::query() [mysqli.query]: Couldn't fetch mysqli in /var/www/hold-ud.dk/public_html/katinka/header.php on line 20
E-mail og kodeord passer ikke sammen


<?php
   
    include('config.php');
   
    if (!isset($_POST['submit'])){
   
   
   
    $username = $_POST['username'];
    $password = $_POST['password'];
   
    echo $username or $password;
   
    $mysqli = new mysqli($conn);
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }

    $sql = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password' LIMIT 1";
    $result = $mysqli->query($sql);
    if (!$result->num_rows == 1) {
        echo "<p>E-mail og kodeord passer ikke sammen</p>";
    } else {
        echo "<p>Det lykkedes at logge ind</p>";
        // do stuffs
    }
}


?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Katinka v 2.0</title>
    <meta http-equiv="content-type" content="charset=iso-8859-1" />
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    <div id="topmenu">
        <div id="login">
        <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
                <a class="opretbruger" href="opret.php">Opret bruger</a>
                <input id="username" type="text" name="username" value="E-mail" />
                <input id="password" type="password" name="password" value="Kodeord" />
                <input name="submit" type="submit" value=" Login " />
            </form>
        </div>
    </div>
    <div id="indholdcontainer">
        <div id="headercontainer">
            <img src="css/images/logony.png" alt="" />
        </div>
        <div id="menu">
                <a class="menu" href="index.php">Forside</a>
                <a class="menu" href="produkter.php">Produkter</a>
        </div>
        <div id="indhold">
Avatar billede olsensweb.dk Ekspert
29. december 2015 - 16:59 #1
prøv at lave dette om
 
$mysqli = new mysqli($conn);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}


til
 
// http://php.net/manual/en/function.mysqli-connect.php
$mysqli = mysqli_connect($hostname, $username, $password, $db);
if (!$mysqli) {
    echo "Error: Unable to connect to MySQL." . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}


eller
 
$mysqli = new mysqli($hostname, $username, $password, $db);
    //  check connection
    if (!$mysqli) {
        echo 'Der opstod en fejl.';
        exit();
    }

Avatar billede erikjacobsen Ekspert
29. december 2015 - 17:01 #2
Hvor er din $conn defineret?

Og så du i hvert fald have ændre

    $mysqli = new mysqli($conn);
    if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
    }

til

    $mysqli = new mysqli($conn);
    if ($mysqli->connect_error) {
    die("Connection failed: " . $mysqli->connect_error);
    }

Og så har du slet ikke opnået noget ved at bruge mysqli når du blot klisterer værdier ind:


    $sql = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password' LIMIT 1";

Brug parameters, for nu er du helt åben for SQL-injection.

Og så mener du nok ikke

  echo $username or $password;

men

  echo $username." ".$password;
Avatar billede erikjacobsen Ekspert
29. december 2015 - 17:03 #3
Og du behøver ikke at gøre det proceduralt som ronols skriver. Men du skal sådan, eksempel:

$mysqli = new mysqli('localhost', 'my_user', 'my_password', 'my_db');
Avatar billede bqnke Nybegynder
29. december 2015 - 17:11 #4
Men jeg har jo hente alle de oplysninger engang i config.php derfor kalder jeg $conn, det vil da være tåbeligt at connecte 2 gange ?
Avatar billede bqnke Nybegynder
29. december 2015 - 17:14 #5
Hele iden, med det her er jeg vil kalde username og passwordet i db'en og tjekke om de stemmer overens, hvis de gøre skriver den det lykkedes at logge ind, hvis ikke email og kodeord passer ikke sammen. :=)
Avatar billede olsensweb.dk Ekspert
29. december 2015 - 18:00 #6
citat

Men jeg har jo hente alle de oplysninger engang i config.php derfor kalder jeg $conn, det vil da være tåbeligt at connecte 2 gange ?
[div]
/citat

hvordan ser din config.php ud ?? (xxx, fortrolige data)
ja, det vil være tåbeligt at åbne din connection igen hvis den allerede er åben

hvis du kalder den $conn i din config.php
skal du slette

$mysqli = new mysqli($conn);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}


og     ændre
$result = $mysqli->query($sql);

til
$result = $conn->query($sql);


citat
[div]
Hele iden, med det her er jeg vil kalde username og passwordet i db'en og tjekke om de stemmer overens

/citat
iden er fin nok, men du er stadig piv åben over for sql injection.
du skal lave en indput validering, hvor du fjerner ulovlige tegn
du kunne også bruge Prepare Statement, som tidligere forslået
Avatar billede olsensweb.dk Ekspert
29. december 2015 - 18:02 #7
ja så er det man ønsker at kunne rette sit indlæg

sådan skulle indlægget have set ud (tror jeg)


citat

Men jeg har jo hente alle de oplysninger engang i config.php derfor kalder jeg $conn, det vil da være tåbeligt at connecte 2 gange ?

/citat

hvordan ser din config.php ud ?? (xxx, fortrolige data)
ja, det vil være tåbeligt at åbne din connection igen hvis den allerede er åben

hvis du kalder den $conn i din config.php
skal du slette

$mysqli = new mysqli($conn);
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}


og     ændre
$result = $mysqli->query($sql);

til
$result = $conn->query($sql);


citat

Hele iden, med det her er jeg vil kalde username og passwordet i db'en og tjekke om de stemmer overens

/citat
iden er fin nok, men du er stadig piv åben over for sql injection.
du skal lave en indput validering, hvor du fjerner ulovlige tegn
du kunne også bruge Prepare Statement, som tidligere forslået
Avatar billede bqnke Nybegynder
29. december 2015 - 18:23 #8
Nu melder den ingen fejl længere, men den skriver ikke det lykkedes at logge ind....

koden ser nu sådan ud(config.php længere nede):
<?php
   
    include('config.php');
   
    if (!isset($_POST['submit'])){
   
   
   
    $username = $_POST['username'];
    $password = $_POST['password'];
   
    echo $username." ".$password;
   

    $sql = "SELECT * FROM `users` WHERE `username` = '$username' AND `password` = '$password' LIMIT 1";
    $result = $conn->query($sql);
    if (!$result->num_rows == 1) {
        echo "<p>E-mail og kodeord passer ikke sammen</p>";
    } else {
        echo "<p>Det lykkedes at logge ind</p>";
        // do stuffs
    }
}


?>
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>Katinka v 2.0</title>
    <meta http-equiv="content-type" content="charset=iso-8859-1" />
    <link rel="stylesheet" type="text/css" href="css/style.css">
</head>
<body>
    <div id="topmenu">
        <div id="login">
        <form action="<?=$_SERVER['PHP_SELF']?>" method="post">
                <a class="opretbruger" href="opret.php">Opret bruger</a>
                <input id="username" type="text" name="username" value="E-mail" />
                <input id="password" type="password" name="password" value="Kodeord" />
                <input name="submit" type="submit" value=" Login " />
            </form>
        </div>
    </div>
    <div id="indholdcontainer">
        <div id="headercontainer">
            <img src="css/images/logony.png" alt="" />
        </div>
        <div id="menu">
                <a class="menu" href="index.php">Forside</a>
                <a class="menu" href="produkter.php">Produkter</a>
        </div>
        <div id="indhold">

<?php
$servername = "xxx";
$username = "xxx";
$password = "xxx;
$database = "xxx";

// Create connection
$conn =  mysqli_connect($servername, $username, $password, $database);

// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
?>
Avatar billede olsensweb.dk Ekspert
29. december 2015 - 19:18 #9
if (!isset($_POST['submit'])){
bliver dette udskrevet    echo $username." ".$password; (Nej, tror jeg ikke)
hvis vi tolker ovenstående isset:
hvis der ikke er posted submit, skal coden udføres



jeg vil prøve denne
if (isset($_POST['submit'])){
dvs fjerne ! foran isset, så det er når der er sendt en submit, coden blliver udført

http://php.net/manual/en/function.isset.php
Avatar billede bqnke Nybegynder
29. december 2015 - 21:51 #10
Mange tak for hjælpen, smid gerne et svar :)
Avatar billede olsensweb.dk Ekspert
29. december 2015 - 22:04 #11
svar
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