Avatar billede riefart Seniormester
19. juli 2015 - 21:24 Der er 9 kommentarer og
1 løsning

opdatering af poster i sql database med random værdi

Jeg har brug for at opdatere en kolonne i de første 200 poster i en tabel. Posterne skal opdateres med et tilfældigt tal eks mellem 14371 og 54853, således at hver post i tabellen får tildelt forskellige tal.
Hvordan gør jeg det med php subsidiært sql (bruger MyPhpAdmin)?
Avatar billede jakobdo Ekspert
19. juli 2015 - 22:20 #1
//Vores tal
$tal = range(14371, 54853);

//Lad os blande dem
shuffle($tal);

//Dine tal
$dine_tal = array_slice($tal, 0, 200);

//Loop $dine_tal og opdater række i mysql
Avatar billede jakobdo Ekspert
19. juli 2015 - 22:21 #2
Du kan måske også bare bruge: http://php.net/manual/en/function.array-rand.php
Avatar billede riefart Seniormester
20. juli 2015 - 00:19 #3
Smart og enkelt. Men hvordan looper jeg $dine_tal i en update query?
Plejer at bruge:
if($stmt=$mysqli->prepare("UPDATE `tabel` SET `kolonne`=? WHERE `id`=?"))
    {
    $stmt->bind_param('ii', $bla, $blabla);
    $stmt->execute();
    $stmt->close();
    }
Avatar billede jakobdo Ekspert
20. juli 2015 - 19:19 #4
Du kunne vel noget ala:

foreach ($dine_tal as $dit_tal) {
  if($stmt=$mysqli->prepare("UPDATE `tabel` SET `kolonne`=? WHERE `id`=?")){
    $stmt->bind_param('ii', $dit_tal, $ID);
    $stmt->execute();
    $stmt->close();
  }
}
Avatar billede olsensweb.dk Ekspert
21. juli 2015 - 10:26 #5
kig på denne lidt hurtigt lavet
   
<?php
/*
  --
  -- Database: `test`
  --

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

  --
  -- Struktur-dump for tabellen `tbl_test`
  --

  CREATE TABLE IF NOT EXISTS `tbl_test` (
  `id` int(11) NOT NULL,
  `value` int(11) NOT NULL
  ) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=latin1;

  --
  -- Data dump for tabellen `tbl_test`
  --

  INSERT INTO `tbl_test` (`id`, `value`) VALUES
  (1, 1),
  (2, 2),
  (3, 3),
  (4, 4);

  --
  -- Begrænsninger for dumpede tabeller
  --

  --
  -- Indeks for tabel `tbl_test`
  --
  ALTER TABLE `tbl_test`
  ADD PRIMARY KEY (`id`);

  --
  -- Brug ikke AUTO_INCREMENT for slettede tabeller
  --

  --
  -- Tilføj AUTO_INCREMENT i tabel `tbl_test`
  --
  ALTER TABLE `tbl_test`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=5;
*/

$mysqli = new mysqli('localhost', 'root', '', 'test');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

// henter de poster der skal ændres
$id_liste = array();
$sql = "SELECT id FROM tbl_test ORDER BY id ASC LIMIT 0,2"; // 0,2 skal selvføgelig være 0,200
if ($result = $mysqli->query($sql)) {
    while ($obj = $result->fetch_object()) {
        $id_liste[] = $obj->id;
    }
}

// ændre de valgte poster
if ($stmt = $mysqli->prepare("UPDATE tbl_test SET value = ? WHERE id = ? ")) {
    foreach ($id_liste as $id) {
        $tal = mt_rand(14371, 54853);
        $stmt->bind_param('ii', $tal, $id);
        $stmt->execute();
    }
    $stmt->close();
}
$mysqli->close();
?>

der er ikke taget højde for at sammen random tal kan gentages

den kan gøres kortere.
Avatar billede riefart Seniormester
22. juli 2015 - 18:05 #6
Har prøvet begge forslag, og får da også opdateret samtlige poster...men med det samme tal.
Jeg vælger at gøre det i MyPhpAdmin i stedet. Tak for bidragene. Smid et svar begge, så I kan dele point.
Avatar billede riefart Seniormester
22. juli 2015 - 18:21 #7
Kom vist til at klikke på den forkerte. I laver bare et svar alligevel......
Avatar billede olsensweb.dk Ekspert
22. juli 2015 - 18:43 #8
>Smid et svar begge, så I kan dele point.
jeg springer point over!!


en lidt kortere vertion af den jeg viste tidligere, du spare en løkke

<?php
$mysqli = new mysqli('localhost', 'root', '', 'test');
if ($mysqli->connect_error) {
    die('Connect Error (' . $mysqli->connect_errno . ') '
            . $mysqli->connect_error);
}

if ($stmt = $mysqli->prepare("UPDATE tbl_test SET value = ? WHERE id = ? ")) {
    $sql = "SELECT id FROM tbl_test ORDER BY id ASC LIMIT 0,2"; // 0,2 skal selvføgelig være 0,200
    if ($result = $mysqli->query($sql)) {
        while ($obj = $result->fetch_object()) {
            $tal = mt_rand(14371, 54853);
            $stmt->bind_param('ii', $tal, $obj->id);
            $stmt->execute();
        }
    }
}
$stmt->close();
$mysqli->close();
?>




men om det kan laves i en sql ala dette, må du lige lege med
ref https://www.google.com/search?q=mysql+add+one

http://stackoverflow.com/questions/13250066/how-to-add-a-number-to-a-current-value-in-mysql-multiple-times-at-the-same-time
UPDATE user SET points = points + 1 WHERE id = 42

http://stackoverflow.com/questions/4214419/add-1-to-field-hit-counter
$sql = "UPDATE ed_names SET c_request = c_request+1 WHERE id = 'x'";

men vi er ude i noget ala dette
ref https://www.google.com/search?q=mysql+subquery+update

dvs selecte og på hver record kører en update
Avatar billede jakobdo Ekspert
24. juli 2015 - 14:40 #9
Svar, hvis du har kunne bruge mine inputs til noget.
Læser det dog ikke som du helt har fået løst dine udfordringer endnu.
Avatar billede riefart Seniormester
25. juli 2015 - 19:11 #10
Nej, jeg fik dem ikke løst med php, men lavede opdateringen direkte i databasen i stedet. Men tak.
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
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

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