Avatar billede brianmilan Juniormester
09. juni 2016 - 21:35 Der er 9 kommentarer og
2 løsninger

Problem med MySQLi kode.

Hej Eksperter.

Jeg har fået et problem i min MySQLi kode. Jeg har en side hvor jeg f.eks. kan søge på kategorien "Action", men den laver fejl når jeg vil have kategorien over på denne side. Er der mon nogen af Jer der evt. kan se hvad der er galt?

Min kode ser sådan her ud:
---------------------------------------------------------------------------------------
<?php
$kategori = isset($_POST['kategori']) ? mysqli_real_escape_string($db, $_POST['kategori']) : '';

function display_kategori($cat) {
  $sql = "SELECT kategori FROM film WHERE kategori LIKE '%$cat%'";
  if( $_SESSION['admin']==3 )
    $sql .= " AND original_kopi LIKE 'Original'";
  $rows = mysqli_query($db,$sql);
  $antal_poster = mysqli_num_rows($rows);
  if( $antal_poster > 0 )
    echo stripslashes ("I kategorien <strong>$cat</strong> er der fundet $antal_poster film:<br>");
  else
    echo stripslashes ("Der er desværre ingen film i kategorien $cat.");
}

//*************************** Viser Film ***************************
function display_film($cat) {
  display_kategori($cat);echo "<br>";
 
  if($_SESSION['admin'] == 3){
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' AND original_kopi LIKE 'Original'
                          ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          } else {
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          }
    while ($row = mysqli_fetch_row($rows))
        {
  echo "<a href='../film.php?film_id=$row[0]'><img src= '../film_covers/film_covers_mini/$row[15]'></a><br><br>$row[1]<br><br>$row[2].";
       
} }

//************** Forbindelse til DB *************************
include "../ConnectDB.php";
connectmydb();
if( isset($_GET['kategori']) ) {
    display_film($_GET['kategori']);
} else
  echo "Kategori findes ikke";?>
---------------------------------------------------------------------------------------

Den kommer med følgende fejlmeddelelser:

Notice: Undefined variable: db in H:\wamp64\www\film\film_search\category_search.php on line 19

Linie 19 er:  $rows = mysqli_query($db,$sql);
---------------------------------------------------------------------------------------
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in H:\wamp64\www\film\film_search\category_search.php on line 19

Linie 19 er:  $rows = mysqli_query($db,$sql);
---------------------------------------------------------------------------------------
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given in H:\wamp64\www\film\film_search\category_search.php on line 20

Linie 20 er:  $antal_poster = mysqli_num_rows($rows);
---------------------------------------------------------------------------------------
Notice: Undefined variable: db in H:\wamp64\www\film\film_search\category_search.php on line 36

Linie 36 er:  $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
---------------------------------------------------------------------------------------
Warning: mysqli_query() expects parameter 1 to be mysqli, null given in H:\wamp64\www\film\film_search\category_search.php on line 36

Linie 36 er:  $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
---------------------------------------------------------------------------------------
Warning: mysqli_num_rows() expects parameter 1 to be mysqli_result, null given in H:\wamp64\www\film\film_search\category_search.php on line 37

Linie 37 er:  $antal_poster = mysqli_num_rows($rows);
---------------------------------------------------------------------------------------
Warning: mysqli_fetch_row() expects parameter 1 to be mysqli_result, null given in H:\wamp64\www\film\film_search\category_search.php on line 39

Linie 39 er:  while ($row = mysqli_fetch_row($rows))
---------------------------------------------------------------------------------------

Jeg kan ikke selv gennemskue hvad det er jeg har gjort forkert eller mangler.

Venlig hilsen
Brian :-)
Avatar billede arne_v Ekspert
09. juni 2016 - 21:50 #1
Undefined variable: db

=> db har ikke faaet en connection
Avatar billede olsensweb.dk Ekspert
09. juni 2016 - 21:54 #2
ref

function display_film($cat) {
 
  display_kategori($cat);echo "<br>";
 
  if($_SESSION['admin'] == 3){
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' AND original_kopi LIKE 'Original'
                          ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          } else {
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          }
    while ($row = mysqli_fetch_row($rows))
        {
  echo "<a href='../film.php?film_id=$row[0]'><img src= '../film_covers/film_covers_mini/$row[15]'></a><br><br>$row[1]<br><br>$row[2].";
       
} }


du mangler at overfører din connection ($db), til din function
ret
function display_film($cat)
til
function display_film($db, $cat)
og selvføgelig også det der hvor du kalder functionen


display_film($cat)
skal være
display_film($db, $cat)


nødløsninger er brug af global

årsagen er functioner har sit eget scope
Avatar billede brianmilan Juniormester
09. juni 2016 - 21:57 #3
Hej Arne og Ronols.

Min connectDB.php ser sådan her ud:
Jeg bruger global $db;

<?php
    function connectmydb()
    {
    global $db;
$db = mysqli_connect("127.0.0.1", "bruger", "pass", "film");
      mysqli_set_charset($db,"utf8");


if (!$db) {
    echo "<h1>Database Fejl!<br/>Adgangen til databasen kunne ikke etableres.</h1>" . PHP_EOL;
    echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
    echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
    exit;
}
    }
?>
Avatar billede olsensweb.dk Ekspert
09. juni 2016 - 22:12 #4
ååh nej ikke en til der bruger global
nåå du skal tilføje global inde i din function function display_film($cat) {


så den ser sådan ud

function display_film($cat) {
  global $db;
  display_kategori($cat);echo "<br>";
 
  if($_SESSION['admin'] == 3){
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' AND original_kopi LIKE 'Original'
                          ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          } else {
    $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
                          $antal_poster = mysqli_num_rows($rows);
                          }
    while ($row = mysqli_fetch_row($rows))
        {
  echo "<a href='../film.php?film_id=$row[0]'><img src= '../film_covers/film_covers_mini/$row[15]'></a><br><br>$row[1]<br><br>$row[2].";
       
} }


og så skal  $db også være kendt uden for connectmydb, så der skal den erklæres som $db
Avatar billede olsensweb.dk Ekspert
09. juni 2016 - 22:20 #5
>og så skal  $db også være kendt uden for connectmydb, så der skal den erklæres som $db


//************** Forbindelse til DB *************************
include "../ConnectDB.php";
$db;
connectmydb();
if( isset($_GET['kategori']) ) {
    display_film($_GET['kategori']);
} else
  echo "Kategori findes ikke";?>
---------------------------------------------------------------------------------------
Avatar billede brianmilan Juniormester
09. juni 2016 - 22:39 #6
Ronols jeg takker mange gange, nu virker det, også når jeg ikke er logget ind som admin :-)

Tak for hjælpen :-)
Avatar billede olsensweb.dk Ekspert
10. juni 2016 - 11:06 #7
>nu virker det,
OK, men her er nogle forbedrings forslag:

>include "../ConnectDB.php";
bør være
require_once "../ConnectDB.php";

da det er temelig vigtigt ConnectDB.php bliver indlæst
once er pga der i filen ligger en function, og hvis man indlæsser sammen function flere gange får man en advarsel og mulige problemer


overfør din database connection som parameter, istedet for at bruge global

function connectmydb() bør retunerer en connection, og ikke bruge global

link
http://php.net/manual/en/function.require-once.php
http://php.net/manual/en/function.include-once.php
http://php.net/manual/en/function.require.php
http://php.net/manual/en/function.include.php


så det code du har vist skal se sådan ud
(utested)

Min connectDB.php ser sådan her ud:
<?php

function connectmydb() {
    $db = mysqli_connect("127.0.0.1", "bruger", "pass", "film");
    mysqli_set_charset($db, "utf8");
    if (!$db) {
        echo "<h1>Database Fejl!<br/>Adgangen til databasen kunne ikke etableres.</h1>" . PHP_EOL;
        echo "Debugging errno: " . mysqli_connect_errno() . PHP_EOL;
        echo "Debugging error: " . mysqli_connect_error() . PHP_EOL;
        exit;
    }
    return $db;
}
?>

//*****************************************

<?php
$kategori = isset($_POST['kategori']) ? mysqli_real_escape_string($db, $_POST['kategori']) : '';

function display_kategori($db, $cat) {
    $sql = "SELECT kategori FROM film WHERE kategori LIKE '%$cat%'";
    if ($_SESSION['admin'] == 3)
        $sql .= " AND original_kopi LIKE 'Original'";
    $rows = mysqli_query($db, $sql);
    $antal_poster = mysqli_num_rows($rows);
    if ($antal_poster > 0)
        echo stripslashes("I kategorien <strong>$cat</strong> er der fundet $antal_poster film:<br>");
    else
        echo stripslashes("Der er desværre ingen film i kategorien $cat.");
}

//*************************** Viser Film ***************************
function display_film($db, $cat) {
    display_kategori($db, $cat);
    echo "<br>";

    if ($_SESSION['admin'] == 3) {
        $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' AND original_kopi LIKE 'Original'
                          ORDER BY original_titel ASC");
        $antal_poster = mysqli_num_rows($rows);
    } else {
        $rows = mysqli_query($db, "SELECT * FROM film WHERE kategori LIKE '%$cat%' ORDER BY original_titel ASC");
        $antal_poster = mysqli_num_rows($rows);
    }
    while ($row = mysqli_fetch_row($rows)) {
        echo "<a href='../film.php?film_id=$row[0]'><img src= '../film_covers/film_covers_mini/$row[15]'></a><br><br>$row[1]<br><br>$row[2].";
    }
}

//************** Forbindelse til DB *************************
require_once "../ConnectDB.php";
$db = connectmydb();

if (isset($_GET['kategori'])) {
    display_film($db, $_GET['kategori']);
} else
    echo "Kategori findes ikke";
?>

nu vil jeg inde i functionerne kunne kalde min connection hvad jeg vil, og hvis jeg smadre connection inde i functionen, påvirker det kun functionen, og ikke resten af programmet
Avatar billede brianmilan Juniormester
11. juni 2016 - 16:02 #8
Hej Ronols.
Tak for dine forslag, dem har jeg taget i brug, og det virker perfekt :-)
Avatar billede arne_v Ekspert
12. juni 2016 - 04:43 #9
Jeg er godt nok vild uenig med stort set al den kode:
- navnet $db er misvisende
- PHP_EOL boer ikke bruges i HTML output
- der boer bruges prepared sttaement
- der boer kun udfoers en enkelt SQL saetning
- database tilgang og HTML generering boer adskilles
- fejlbeskeden hvis kategori ikke angives er misvisende
- scope for connection
- function for connection med fastlagt fejlhaandtering
Avatar billede arne_v Ekspert
12. juni 2016 - 05:41 #10
Et forsoeg paa at lave det i bedste 70er stil:


<?php
/*

CREATE TABLE movie (
    id INTEGER NOT NULL,
    title VARCHAR(100),
    description VARCHAR(255),
    category VARCHAR(100),
    cover VARCHAR(50),
    copy VARCHAR(10), -- 'Original' or 'Kopi'
    PRIMARY KEY(id)
);
INSERT INTO movie VALUES(1, 'Horse Soldiers', 'John Wayne bla bla', 'Western', 'hs.png', 'Kopi');
INSERT INTO movie VALUES(2, 'Rio Bravo', 'John Wayne, Dean Martin bla bla', 'Western', 'rb.png', 'Kopi');
INSERT INTO movie VALUES(3, 'Starwars VII', 'Bla bla', 'Schience Fiction', 'sw7.png', 'Original');

*/

define('DB_SERVER', 'localhost');
define('DB_USERNAME', 'root');
define('DB_PASSWORD', '');
define('DB_DATABASE', 'test');

define('FLAG', 'admin');
define('ORIGINAL_FLAG', 3);

define('FORMAT_ZERO_MOVIES', "No movies in category %s\r\n"); // category
define('FORMAT_SOME_MOVIES', "Category <strong>%s</strong> has %d movies:\r\n"); // category,count
define('FORMAT_MOVIE_INFO', "<br>\r\n<a href='movie.php?id=%d><img src='cover/%s'></a><br>\r\n<br>\r\n%s<br>\r\n<br>\r\n%s\r\n"); // id,cover,title,description

function fatal_error($msg) {
    die($msg);   
}

function get_movies_by_category($cat) {
    if($con = mysqli_connect(DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE)) {
        $sql = "SELECT id, title, description, cover FROM movie WHERE category LIKE ? ORDER BY title ASC";
        if ($_SESSION[FLAG] == ORIGINAL_FLAG) {
            $sql .= " AND copy = 'Original'";
        }
        if($stmt = mysqli_prepare($con, $sql)) {
            mysqli_stmt_bind_param($stmt, 's', $wccat);
            $wccat = '%' . $cat . '%';
            if($stmt->execute()) {
                $stmt->store_result();
                $stmt->bind_result($id, $title, $description, $cover);
                $res = array();       
                while(mysqli_stmt_fetch($stmt)) {
                    $res[] = array('id' => $id, 'title' => $title, 'description' => $description, 'cover' => $cover);
                }
                mysqli_close($con);
                return $res;
            } else {
                fatal_error(mysqli_error($con));
            }
        } else {
            fatal_error(mysqli_error($con));
        }
    } else {
        fatal_error(mysqli_connect_error());
    }
}

function display_movies($movies, $cat) {
    if(count($movies) > 0) {
        echo sprintf(FORMAT_SOME_MOVIES, $cat, count($movies));
        foreach($movies as $movie) {
            echo sprintf(FORMAT_MOVIE_INFO, $movie['id'], $movie['cover'], $movie['title'], $movie['description']);
        }
    } else {
        echo sprintf(FORMAT_ZERO_MOVIES, $cat);
    }
}

if (isset($_GET['category'])) {
    $movies = get_movies_by_category($_GET['category']);
    display_movies($movies, $_GET['category']);
} else {
    fatal_error('Category not specified');
}
   
?>
Avatar billede arne_v Ekspert
12. juni 2016 - 05:42 #11
Hmm. Indrykningen roeg.  :-(
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