Avatar billede Morten Professor
24. november 2015 - 20:14 Der er 12 kommentarer og
1 løsning

mysqli delete for 1 dag

Hej Eksperter

Jeg vil høre om i kan hjælpe mig med at få det her til at virke i mysqli.
Ved hvordan jeg skal gøre i mysql.


ini_set("display_startup_errors", "on");
ini_set("display_errors", "on");
ini_set("html_errors", "false");
error_reporting(-1); // -1 viser alle slags fejl beskeder
ini_set("ignore_repeated_errors", 0);

/* Select et prepared statement */
if ($stmt = $hellestrik->prepare('SELECT datetime FROM `tbl_url_antal_hits`')) {

    /* Bind parametre */
    $stmt->bind_param('s', $datetime);

    /* Sæt værdier på parametrene */
    $datetime = $_POST['datetime'];

    /* Eksekver forespørgslen */
    $stmt->execute();

    /* Bind resultatet */
    $stmt->bind_result($datetime);

    /* Hent rækker og udskriv data */
    while ($stmt->fetch()) {
    ;}}

/* Delete et prepared statement */
$stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY');
$stmt->bind_param('s', $datetime);
$stmt->execute();
$stmt->close();

echo '<form id="delete" name="delete" method="post" action="">
  <input name="datetime" type="hidden" id="datetime" value="<?php echo $datetime; ?>" />
</form>';


Med venlig hilsen
Morten
Avatar billede arne_v Ekspert
24. november 2015 - 20:23 #1
Det ser ikke ud som om du bruger output fra SELECT saa den del kan vel helt undlades i koden.

$stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY');

skal nok vaere:

$stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE `datetime` < DATE_SUB(NOW(),INTERVAL 1 DAY');

da datetime er et reserveret ord og et felt med det navn skal escapes.
Avatar billede olsensweb.dk Ekspert
24. november 2015 - 20:39 #2
hvorfor selecter du den først ??
får du ikke en syntax fejl ??, hvis jeg tæller antallet at () i din delete passer det ikke, du mangler en slut parantes

(ca sådan utested)

ini_set("display_startup_errors", "on");
ini_set("display_errors", "on");
ini_set("html_errors", "false");
error_reporting(-1); // -1 viser alle slags fejl beskeder
ini_set("ignore_repeated_errors", 0);

if(isset($_POST['datetime'])){
    /* Delete et prepared statement */
    if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE `datetime` < DATE_SUB(NOW(),INTERVAL 1 DAY'))){
        $stmt->bind_param('s', $datetime);
        $datetime = $_POST['datetime'];
        $stmt->execute();
        $stmt->close();
    }
}
echo '<form id="delete" name="delete" method="post" action="">
  <input name="datetime" type="hidden" id="datetime" value="<?php echo $datetime; ?>" />
</form>';

som arne_v er inde på, vær opmærksom på at datetime er et reseveret ord i mysql, og derfor bør der sættet backtick omkring, eller allerbedst omdøb collonnen
Avatar billede arne_v Ekspert
24. november 2015 - 20:55 #3
Jeg er slet ikke sikker paa at der skal parameter paa.

WHERE `datetime` < DATE_SUB(NOW(),INTERVAL 1 DAY')

giver en vis mening med et felt `datetime`. Der skal bare ingen parameter med.

Men:

WHERE ? < DATE_SUB(NOW(),INTERVAL 1 DAY')

skal have en parameter men synes jeg ikke giver mening.
Avatar billede Morten Professor
24. november 2015 - 21:13 #4
Virkede desvære ikke


if(isset($_POST['datetime'])){
    /* Delete et prepared statement */
    if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE `datetime_` < DATE_SUB(NOW(),INTERVAL 1 DAY')){
        $stmt->bind_param('s', $datetime);
        $datetime = $_POST['datetime'];
        $stmt->execute();
        $stmt->close();
    }
}


Får ikke nogen fejl.
Avatar billede olsensweb.dk Ekspert
24. november 2015 - 21:16 #5
#3
du har da fuldstændig ret arne_v :)

som jeg har skrevet tidligere til spørgeren!
hvor mange spørgsmåls tegn er der i sql ??
hvor mange bind_param skal der laves ??
dette hænger sammen
Avatar billede Morten Professor
24. november 2015 - 21:29 #6
Jeg prøvede at omdøbe colonnen men virkede ikke.
Har prøvet med ? istedet for `datetime` virkede heller ikke.

Det med "som jeg har skrevet tidligere til spørgeren!
hvor mange spørgsmåls tegn er der i sql ??
hvor mange bind_param skal der laves ??
dette hænger sammen"
Har jeg vist ikke helt fået ind på rygraden endnu.
Avatar billede olsensweb.dk Ekspert
24. november 2015 - 21:48 #7
bruger lige BETWEEN istedet, det er pænere
(utested)
   
if(isset($_POST['datetime'])){
    /* Delete et prepared statement */
    if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime_ BETWEEN (?  - INTERVAL 1 DAY) AND ? )) {
        $stmt->bind_param('ss', $datetime, $datetime);
        $datetime = $_POST['datetime'];
        $stmt->execute();
        $stmt->close();
    }
}


ikke flere indlæg i aften
Avatar billede Morten Professor
24. november 2015 - 22:06 #8
Øv virkede heller ikke desværre.

Bare lige så i ved det, er det en side helt for sig selv der er kun linket til databasen.
Avatar billede olsensweb.dk Ekspert
25. november 2015 - 09:39 #9
>Øv virkede heller ikke desværre.
lidt svært at fejlfinde uden fejl beskrivelse, den skulle gerne sige der er en syntax fejl, da der mangler en afslutning af sql stringen (')
ellers kan man også se det når man ligger det i et php fil, og åbner med en editor der har syntax highlight

men øhh, hvad nu hvis datetime_ er mere end 2 dage gammel ??, så vil den ikke blive ovenstående, da det ikke er i intervallet, så between kan ikke bruges

hvad står der i value i
<input name="datetime" type="hidden" id="datetime" value="<?php  ???

hvor submitter du din form ??, får du sendt din datetime over (kan være lavet med js ikke vist)

skal du have en dato over ??
bruger du datoen til andet ??
kan du ikke bare bruge now() ??

-----------------------------------------
under udvikling hav altid fejlvisning slået til
at tro man kan udvikle uden at begå fejl er utopi
at udvikle uden at rette sine fejl er idioti
---------------------------------------------


ref
echo '<form id="delete" name="delete" method="post" action="">
  <input name="datetime" type="hidden" id="datetime" value="<?php echo $datetime; ?>" />
</form>';

får du ikke en fejl her ??, du starter php midt inde i php
Avatar billede Morten Professor
25. november 2015 - 12:47 #10
Jeg fik lavet den her og det virker.


<?php
  $deleteSQL = "DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY)";

  mysqli_select_db($hellestrik, "DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY)");
  $Result1 = mysqli_query($hellestrik, $deleteSQL) or die(mysqli_error($hellestrik));


mysqli_select_db($hellestrik, "SELECT * FROM tbl_url_antal_hits");
$query_rsSlet_efter_1_dag = "SELECT * FROM tbl_url_antal_hits";
$rsSlet_efter_1_dag = mysqli_query($hellestrik, $query_rsSlet_efter_1_dag) or die(mysqli_error($hellestrik));
$row_rsSlet_efter_1_dag = mysqli_fetch_assoc($rsSlet_efter_1_dag);
$totalRows_rsSlet_efter_1_dag = mysqli_num_rows($rsSlet_efter_1_dag);
?>


Det er bare ikke så overskueligt som med mysqli.
Det er derfor jeg gerne vil lære at lave det i mysqli.

Da det er en rettelse fra mysql.
Avatar billede olsensweb.dk Ekspert
25. november 2015 - 13:46 #11
#10
det er stadig mysqli (procedural style)

>Det er bare ikke så overskueligt som med mysqli.
>Det er derfor jeg gerne vil lære at lave det i mysqli.
du mener vel Prepare Statement


>mysqli_select_db($hellestrik, $sql);
forstår jeg stadig væk ikke hvorfor du bruger

her er 3 andre måder at lave din delete på

coderne er utested, men burde ligge tæt på
   
<?php
// mysqli OOP style
$deleteSQL = "DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY)";
$Result1 = $hellestrik->query($deleteSQL) or die($hellestrik->error);
?>


   
<?php
// her er der vel ikke nogle grund til at bruge Prepare Statement
if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(NOW(),INTERVAL 1 DAY)') {       
    $stmt->execute();
    $stmt->close();
}
?>


   
<?php
if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(?,INTERVAL 1 DAY)') {
    $stmt->bind_param('s', $datetime);
    $datetime = date("Y-m-d H:i:s");
    $stmt->execute();
    $stmt->close();
}
?>   
Avatar billede Morten Professor
25. november 2015 - 14:03 #12
Hej ronols

Det virkede mange tak for hjælpen :o)

Vil du smide et svar så du kan få dine point ;o)


<?php
if($stmt = $hellestrik->prepare('DELETE FROM tbl_url_antal_hits WHERE datetime < DATE_SUB(?,INTERVAL 1 DAY)') {
    $stmt->bind_param('s', $datetime);
    $datetime = date("Y-m-d H:i:s");
    $stmt->execute();
    $stmt->close();
}
?> 


Med venlig hilsen
Morten
Avatar billede olsensweb.dk Ekspert
25. november 2015 - 14:13 #13
får du her
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