Avatar billede steen-h Mester
29. april 2016 - 16:27 Der er 10 kommentarer og
1 løsning

Prepared Statements, if sætning virker ikke

Jeg har følgende kald til databasen, det virke fint, men hvis der ikke er nogle data retur (ingen tabeller som opfylder kravet) hvorfor kører if sætningen så ?


if ($admindata = $mysqli->prepare("SELECT id, user FROM veight_admin WHERE sim = ?") ){
    $admindata->bind_param('s', $sim);
    $sim = $_GET['id'];
    $admindata->execute();
    $admindata->bind_result($adminid, $adminuser);
    $admindata->fetch();
    $admindata->close();
echo " <br>_ ".$adminid;
}
Avatar billede phpnoob Novice
29. april 2016 - 16:45 #1
hvad med

foreach($row as $r)
{
    if(empty($r)) //gør noget hvis den er tom eller ikke
}
Avatar billede steen-h Mester
29. april 2016 - 17:04 #2
phpnoob det var selvfølgelig en mulighed.

Men det er fordi jeg misforstod if sætningen.
Kaldet til databasen gik godt, der var bare ingen rækker som opfylder kravet.

Der er en function som tæller antallet af rækker $admindata->num_rows

Man skal huske $admindata->store_result() inden functionen kaldes.

Her er min endelige kode

if ($admindata = $mysqli->prepare("SELECT id, user FROM veight_admin WHERE sim = ?") ){
    $admindata->bind_param('s', $sim);
    $sim = $_GET['id'];
    $admindata->execute();
    $admindata->bind_result($adminid, $adminuser);
    $admindata->store_result(); // husk ->store_result inden ->num_rows
    $admindata->fetch();
    $numberofrows = $admindata->num_rows;
}
Avatar billede olsensweb.dk Ekspert
29. april 2016 - 17:11 #3
>(ingen tabeller som opfylder kravet)
her mener du vel rækker !!
havde det været tabel, eller manglende felter havde du fået en sql fejl, som du så ikke tester på

så snart du kalder fetch udtrækker du data, så derfor skal du teste om der er noget.



prøv dette (utested)

if ($admindata = $mysqli->prepare("SELECT id, user FROM veight_admin WHERE sim = ?") ){
    $admindata->bind_param('s', $sim);
    $sim = $_GET['id'];
    $admindata->execute();
    $admindata->bind_result($adminid, $adminuser);
   
   
    while ($admindata->fetch() ) {
        echo "id = " . $adminid . " user = " . $adminuser . '<br>';
    }
   
   
    $admindata->close();
   
}
else{
    /* Der er opstået en fejl */
    echo 'Der opstod en fejl i erklæringen: ' . $mysqli->error;
}




du kan evt teste på execute
eks Example #2 Second stage: bind and execute
http://php.net/manual/en/mysqli.quickstart.prepared-statements.php 


ref http://stackoverflow.com/questions/2552545/mysqli-prepared-statements-error-reporting

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}


$stmt->close();
Avatar billede arne_v Ekspert
30. april 2016 - 03:09 #4
Fot at taelle antal raekker ville jeg bruge COUNT i SQL saetningen.
Avatar billede steen-h Mester
30. april 2016 - 05:13 #5
#3 Ja det er rækker jeg mener.

Jeg vil lige forklare hvad jeg gør.
Jeg spørger på et simnummer om det findes (en række)
Hvis det gør spørger jeg på et imeinummer (en række)
Hvis det gør opdaterer jeg en række.
Hvis simnummeret ikke findes gør jeg noget som ikke er vist her

Jeg bruger ->num_rows til at finde ud af om jeg får en række retur,
kan det laves smartere med COUNT i SQL saetningen ?



// test om simnummer findes i databasen
if ($admindata = $mysqli->prepare("SELECT id, user FROM veight_admin WHERE sim = ?") ){
  $admindata->bind_param('s', $sim);
  $sim = $_GET['id'];
  $admindata->execute();
  $admindata->bind_result($adminid, $adminuser);
  $admindata->store_result();
  $admindata->fetch();
  $numberofrows_sim = $admindata->num_rows;  // husk ->store_result inden ->num_rows
  $admindata->close();

  if($numberofrows_sim > 0){
  // test om imei findes i databasen
    if ($imeidata = $mysqli->prepare("SELECT id,noload, scale FROM veight_imei WHERE imei = ?") ){
      $imeidata->bind_param('s', $imei);
      $imei = $_GET['imei'];
      $imeidata->execute();
      $imeidata->bind_result($imeiid, $noload, $scale);
      $imeidata->store_result();
      $imeidata->fetch();
      $numberofrows = $imeidata->num_rows;  // husk ->store_result inden ->num_rows
      $imeidata->close();


      if($numberofrows_sim > 0)
        if ($updatedata = $mysqli->prepare('UPDATE veight_admin SET imei=? WHERE id=?')) {
          $updatedata->bind_param('ss', $imei, $id);
          $imei = $imeiid;
          $id = $adminid;
          $updatedata->execute();
          $updatedata->close();
Avatar billede olsensweb.dk Ekspert
30. april 2016 - 17:03 #6
du vil hjælpe os andre hvis du lagde din code ind i en blå box med scroll bar i bunden

jeg tror du lave en lille fejl her
$numberofrows_sim skal vel være $numberofrows


if ($numberofrows_sim > 0) {
    if ($updatedata = $mysqli->prepare('UPDATE veight_admin SET imei=? WHERE id=?')) {



 
if ($numberofrows > 0) {
    if ($updatedata = $mysqli->prepare('UPDATE veight_admin SET imei=? WHERE id=?')) {
   


>kan det laves smartere med COUNT i SQL saetningen ?
prøvede at omskrive med brug af count som arne_v forslog, og tilføjede nogle else sætninger, bla som lidt fejl håndtering

må du selv vurderer om det er smartere

<?php
// det er ikke alvorligt hvis filen mangler, tilgengæld må den KUN indlæsses 1 gang pga define('IN_DEBUG_MODE', true);
include_once("debugheader.php");
// conection SKAL indlæsses
require_once('connection.php');


// test om simnummer findes i databasen
if ($admindata = $mysqli->prepare("SELECT id, user, count(id) AS num_of_rows  FROM veight_admin WHERE sim = ?")) {
    $admindata->bind_param('s', $sim);
    $sim = $_GET['id'];   
    $admindata->execute();
    $admindata->bind_result($adminid, $adminuser, $numberofrows_sim);   
    $admindata->fetch();   
    $admindata->close();   
    if ($numberofrows_sim > 0) {
        // test om imei findes i databasen
        if ($imeidata = $mysqli->prepare("SELECT id,noload, scale, count(id) AS num_of_rows FROM veight_imei WHERE imei = ?")) {
            $imeidata->bind_param('s', $imei);
            $imei = $_GET['imei'];           
            $imeidata->execute();
            $imeidata->bind_result($imeiid, $noload, $scale, $numberofrows);           
            $imeidata->fetch();           
            $imeidata->close();
           
            // if ($numberofrows_sim > 0) {
            if ($numberofrows > 0) {
                if ($updatedata = $mysqli->prepare('UPDATE veight_admin SET imei=? WHERE id=?')) {
                    $updatedata->bind_param('ss', $imei, $id);
                    $imei = $imeiid;
                    $id = $adminid;
                    $updatedata->execute();
                    $updatedata->close();
                } else {
                    // manglende connection, forkerte kollonne navne, tabel navn
                    echo '1.2 Noget gik galt...' . $mysqli->error;
                }
            } else {               
                echo "numberofrows er 0";
            }
        } else {
            // manglende connection, forkerte kollonne navne, tabel navn
            echo '1.1 Noget gik galt...' . $mysqli->error;
        }
    } else {       
        echo "sim værdien findes ikke, numberofrows_sim er 0";
    }
} else {
    // manglende connection, forkerte kollonne navne, tabel navn
    echo '1 Noget gik galt...' . $mysqli->error;
}
?>
   

nb: jeg kunne godt nøjes med at skrive count(id) AS num_of_rows som count(id), her i Prepare Statement, men det er en gammel vane altid at sætte alias på
Avatar billede olsensweb.dk Ekspert
30. april 2016 - 17:07 #7
>$admindata->bind_param('s', $sim);
>$updatedata->bind_param('ss', $imei, $id);
hvorfor er alle dine bind_param strings ??, havde forvendtet int minimum ved id
Avatar billede arne_v Ekspert
01. maj 2016 - 02:49 #8
Hvis der er rigtigt mange raekker, saa er COUNT meget bedre end at hente alle raekker og taelle dem.
Avatar billede steen-h Mester
01. maj 2016 - 06:06 #9
#6
Jeg vil huske at lave en  blå box næste gang.

Ja det var en fejl
$numberofrows_sim skal vel være $numberofrows


Jeg kan godt se det smarte med COUNT, det gør det hele mere overskuligt.

#7
hvorfor er alle dine bind_param strings ??, havde forvendtet int minimum ved id

Det er også en fejl. Men lige id er et simnummer og CBB har et F sidst i simnummeret.

Nu er det meget nyt med Prepared Statements og var lidt svært at få startet, men kan godt se det smarte i det.

Jeg vil gerne takke for hjælpen.
Læg et svar ronols og arne_v
Avatar billede olsensweb.dk Ekspert
01. maj 2016 - 10:01 #10
svar
Avatar billede arne_v Ekspert
02. maj 2016 - 03:14 #11
Jeg skal ikke have point. Jeg har ikke bidraget med noget til spoergsmaalet som saadan - kun med en betragtning omkring tilgangen til det bagvedliggende problem.
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