Avatar billede Tobleronealfen Nybegynder
26. april 2016 - 23:33 Der er 13 kommentarer og
2 løsninger

Hjælp til mysql query

Godaften!

Jeg har besluttet mig at lære html, php og mysql.
men nu sidder jeg og bokser lidt med en INSERT INTO query der ikke rigtig vil virke.

Er der nogen der vil tage et kig på den?

$addnewusertodb = "INSERT INTO users (username, email, password, usergroup) VALUES ('$newname', '$newemail', '$newpassword', $newusergroupid)";
if(mysql_query($addnewusertodb)){
    echo "<p>Bruger er tilføjet</p>";
} else{
    echo "<p>Fejl: " . mysql_error($addnewusertodb) . "</p>";

Jeg bruger følgende linjer tidligere i koden for at kontrollere brugernavn og kode. Dette virker fint.

$connectdb = new mysqli($db_server, $db_user, $db_pw, $db_name);
if ($connectdb->connect_error) {
    die("Forbindelsesfejl: " . $connectdb->connect_error);
};
$row = $connectdb->query("SELECT * FROM users WHERE username='{$username}'")->fetch_array();
Avatar billede arne_v Ekspert
27. april 2016 - 01:45 #1
$connectdb = new mysqli($db_server, $db_user, $db_pw, $db_name);

er mysqli extension

if(mysql_query($addnewusertodb)){


er mysql extension

Det virker ikke rigtigt at bruge begge!
Avatar billede arne_v Ekspert
27. april 2016 - 01:47 #2
password er et reserveret ord i MySQL, saa

$addnewusertodb = "INSERT INTO users (username, email, password, usergroup) VALUES

maa skulle vaere:

$addnewusertodb = "INSERT INTO users (username, email, `password`, usergroup) VALUES

eller bedre - find et andet feltnavn.
Avatar billede Tobleronealfen Nybegynder
27. april 2016 - 09:08 #3
Har jeg forstået det korrekt at der er to måder at lave queries? mysql og mysqli ?

Jeg har nu ændret koden til:

$addnewusertodb = "INSERT INTO users (username, email, userpw, usergroup) VALUES ('$newname', '$newemail', '$newpassword', $newusergroupid)";

if(mysqli_query($addnewusertodb)){
    echo "<p>Bruger er tilføjet</p>";
} else{
    echo "<p>Fejl: " . mysqli_error($connectdb) . "</p>";
};

Men output på skærmen erblot

Fejl:
Avatar billede jakobdo Ekspert
27. april 2016 - 10:17 #4
Du har forstået det "rigtigt" ja.
mysql er den gamle og deprecated måde (udgår i php7 mener jeg)
mysqli er den ny og mere sikre måde.
Du kan også overveje PDO.
Men start evt. med mysqli.
Og så bør du overveje prepared statements.

Din kode kunne muligvis se sådan her ud:

<?php
$connectdb = new mysqli($db_server, $db_user, $db_pw, $db_name);

/* check connection */
if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit();
}

/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {

  /* bind parameters for markers */
  $stmt->bind_param("ssss", $newname, $newemail, $newpassword, $newusergroupid);

  /* execute query */
  $stmt->execute();

  /* close statement */
  $stmt->close();
}

/* close connection */
$mysqli->close();
?>
Avatar billede olsensweb.dk Ekspert
27. april 2016 - 13:07 #5
#2
>password er et reserveret ord i MySQL, saa
http://dev.mysql.com/doc/refman/5.7/en/keywords.html
det er vel "bare" et Keywords, og ikke resevered, det har ikke et (R)

tilsvarende liste for PHP
http://php.net/manual/en/reserved.keywords.php


#3
if(mysqli_query($connectdb, $addnewusertodb)){ // Procedural style
kunne også skrives som
if($connectdb->query($addnewusertodb)){ // OOP style

eller som Prepare Statement, som jakobdo skriver i #4


#4
>mysql er den gamle og deprecated måde (udgår i php7 mener jeg)
er udgået i PHP7 (php7 blev frigivet 2015-12-03)
ref http://php.net/mysql_connect

Warning
This extension was deprecated in PHP 5.5.0, and it was removed in PHP 7.0.0. Instead, the MySQLi or PDO_MySQL extension should be used. See also MySQL: choosing an API guide and related FAQ for more information.


>Du kan også overveje PDO.
>Men start evt. med mysqli.
>Og så bør du overveje prepared statements.
enig
Prepare Statement kan være lidt svær at starte med, især hvis man ikke er vant til at skrive sql, men ja på sigt


******************

det nemmeste er at skifte til mysqli, i mysqli kan du anvende 2 styles frit som du har lyst

procedural style: som du kender fra det gamle mysql, der er grundlæggende bare tilføjet et i, i alle mysql_ kommandoerne så de hedder mysqli_, og ved mange af dem skal du også angive din connection

OOP style: dette er det der anvendes mest, og er fremtiden

Prepare Statement: er noget af det nye der er kommet til i mysqli, en kvik guide http://www.eksperten.dk/guide/1480
du har kun numbered place holders


*************

PDO: dette ser jeg som det fremtidige ext (API), du kan kun anvende OOP style, tilgengæld har du alle fordele fra ODBC men ikke ulemperne ved at skulle installerer en system driver

Prepare Statement: er klart forbedret i forhold til mysqli, men en klar fordel at have kendskab til Prepare Statement under mysqli IMHO
du har numbered placeholders og named placeholders, sidst nævnte er klart nemmere at læse IMHO

********************


>Din kode kunne muligvis se sådan her ud:
ja med lille rettelse:

$mysqli->prepare("
skulle være
$connectdb->prepare("

nu du har valgt at kalde din connection for $connectdb og ikke $mysqli.
copy / paste er godt, men kræver ofte lidt tilpasning :)
Avatar billede Tobleronealfen Nybegynder
27. april 2016 - 16:08 #6
Nu har jeg prøvet at skrive det lidt om, men jeg kan stadig ikke få det til at virke...

Jeg har ændret bind_param til "sssi", da $newusergroupid er INT.
Jeg har en anden kolonne i tabellen der er AUTO_INCREMENT. Men den skal jeg vel bare ignorere da den passer sig selv?

Her er hele koden:

<?php

$newname = $_POST['add_name'];
$newemail = $_POST['add_email'];
$newpassword = $_POST['add_password'];
$newusergroup = $_POST['add_usergroup'];

if ($newusergroup == TRUE) {
    $newusergroupname = "Administrator";
    $newusergroupid = 1;
} else {
    $newusergroupid = 2;
};

// Kontrol af variabler
echo '<p>Dette er brugernavnet: ' . $newname . '</p>';
echo '<p>Dette er emailadressen: ' . $newemail . '</p>';
echo '<p>Dette er adgangskoden: ' . $newpassword . '</p>';
if ($newusergroupid == 1) {
    echo '<p>Brugeren er ' . $newusergroupname . '</p>';
} else {
    echo '<p>Brugeren er ikke administrator.</p>';
};

// Tilføj til database
if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit();
} else {
    echo 'Forbindelse til database er ok.';
    };

/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {

  /* bind parameters for markers */
  $stmt->bind_param("sssi", $newname, $newemail, $newpassword, $newusergroupid);

  /* execute query */
  $stmt->execute();

  /* close statement */
  $stmt->close();
} else {
    echo 'Noget gik galt...';
};

/* close connection */
$mysqli->close();

?>
Avatar billede Tobleronealfen Nybegynder
27. april 2016 - 16:14 #7
Jeg har ændret $connectdb til $mysqli :-)
Avatar billede olsensweb.dk Ekspert
27. april 2016 - 17:01 #8
jeg har rettet lidt i din code, og afprøvet den

dette er output

Dette er brugernavnet: RonOls

Dette er emailadressen: ronols@olsensweb.dk

Dette er adgangskoden: 1234

Brugeren er Administrator


test db
 
--
-- Database: `test`
--

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

--
-- Struktur-dump for tabellen `users`
--

CREATE TABLE `users` (
  `id` int(11) NOT NULL,
  `username` varchar(25) COLLATE utf8_danish_ci NOT NULL,
  `email` varchar(50) COLLATE utf8_danish_ci NOT NULL,
  `password` varchar(255) COLLATE utf8_danish_ci NOT NULL,
  `usergroup` int(11) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci;

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

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


--
-- Tilføj AUTO_INCREMENT i tabel `users`
--
ALTER TABLE `users`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT;


test code
 
<?php

// connection bør ligge i en extern fil, der includeres,
// connection start
$mysqli = new mysqli("localhost", "root", "", "test");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

// Tilføj til database kan slettes, er lavet ovenover
/*
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
} else {
    echo 'Forbindelse til database er ok.';
};
*/
// connection slut


// gider ikke lave noget der poster for at teste
/*
  $newname = $_POST['add_name'];
  $newemail = $_POST['add_email'];
  $newpassword = $_POST['add_password'];
  $newusergroup = $_POST['add_usergroup'];
*/

// test data
$newname = "RonOls";
$newemail = "ronols@olsensweb.dk";
$newpassword = "1234"; // skal krypteres med feks sha512
$newusergroup = TRUE;




if ($newusergroup == TRUE) {
    $newusergroupname = "Administrator";
    $newusergroupid = 1;
} else {
    $newusergroupid = 2;
};

// Kontrol af variabler
echo '<p>Dette er brugernavnet: ' . $newname . '</p>';
echo '<p>Dette er emailadressen: ' . $newemail . '</p>';
echo '<p>Dette er adgangskoden: ' . $newpassword . '</p>';
if ($newusergroupid == 1) {
    echo '<p>Brugeren er ' . $newusergroupname . '</p>';
} else {
    echo '<p>Brugeren er ikke administrator.</p>';
};


/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {

    /* bind parameters for markers */
    $stmt->bind_param("sssi", $newname, $newemail, $newpassword, $newusergroupid);

    /* execute query */
    $stmt->execute();

    /* close statement */
    $stmt->close();
} else {
    echo 'Noget gik galt...';
};

/* close connection */
$mysqli->close();
?>


og der insættes en record i db :)


så prøv at kontrollerer de data du for sendt over som post, ellers må du fortælle hvilke fejl du får
Avatar billede Tobleronealfen Nybegynder
28. april 2016 - 00:17 #9
Ingen held endnu :(

Jeg har en included en fil med følgende indhold:

-------
$db_server = "localhost";
$db_user = "xxxx";
$db_pw = "xxxx";
$db_name = "xxxx";

$mysqli = new mysqli($db_server, $db_user, $db_pw, $db_name);

if (mysqli_connect_errno()) {
  printf("Connect failed: %s\n", mysqli_connect_error());
  exit();
} else {
    echo 'Forbindelse til database er ok.';
    };
-------

Det virker tilsyneladende fint, da jeg kan sammenligne POST med en record i databasen.

Her er igen indholdet af min "tilføj bruger" funktion:

-------
<?php

/*$newname = $_POST['add_name'];
$newemail = $_POST['add_email'];
$newpassword = $_POST['add_password'];
$newusergroup = $_POST['add_usergroup'];*/

// test data
$newname = "RonOls";
$newemail = "ronols@olsensweb.dk";
$newpassword = "1234"; // skal krypteres med feks sha512
$newusergroup = TRUE;

if ($newusergroup == TRUE) {
    $newusergroupname = "Administrator";
    $newusergroupid = 1;
} else {
    $newusergroupid = 2;
};

// Kontrol af variabler
echo '<p>Dette er brugernavnet: ' . $newname . '</p>';
echo '<p>Dette er emailadressen: ' . $newemail . '</p>';
echo '<p>Dette er adgangskoden: ' . $newpassword . '</p>';
if ($newusergroupid == 1) {
    echo '<p>Brugeren er ' . $newusergroupname . '</p>';
} else {
    echo '<p>Brugeren er ikke administrator.</p>';
};

/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {

  /* bind parameters for markers */
  $stmt->bind_param("sssi", $newname, $newemail, $newpassword, $newusergroupid);

  /* execute query */
  $stmt->execute();

  /* close statement */
  $stmt->close();
} else {
    echo 'Noget gik galt...';
};

/* close connection */
$mysqli->close();
?>
-------

Og her er en export af tabellen:

-------
-- phpMyAdmin SQL Dump
-- version 4.0.10.7
-- http://www.phpmyadmin.net
--
-- Host: localhost:3306
-- Generation Time: Apr 27, 2016 at 11:57 PM
-- Server version: 10.0.24-MariaDB
-- PHP Version: 5.4.31

SET SQL_MODE = "NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";


/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8 */;

--
-- Database: `kousholt_playground`
--

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

--
-- Table structure for table `users`
--

CREATE TABLE IF NOT EXISTS `users` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `email` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `userpw` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `usergroup` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=8 ;

--
-- Dumping data for table `users`
--

INSERT INTO `users` (`id`, `username`, `email`, `userpw`, `usergroup`) VALUES
(1, 'Jan', 'jan-mail', '1234', 1),
(2, 'Jeanette', 'Jeanette-mail', '1234', 2);

/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
-------

Jeg håber du stadig kan hjælpe :o)

- Password vil blive krypteret. Men lige nu lærer jeg blot.
- Hvordan laver du quotes omkring den kode du poster her på Eksperten?
- Bør jeg bruge $mysqli->close(); efter hver gang jeg har lavet en query?
- Hvordan tilføjer jeg fejlbeskrivelse hvis en query fejler?
Avatar billede olsensweb.dk Ekspert
28. april 2016 - 09:53 #10
ref

if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {



CREATE TABLE IF NOT EXISTS `users` (
  `id` int(3) NOT NULL AUTO_INCREMENT,
  `username` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `email` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `userpw` varchar(30) COLLATE utf8_danish_ci NOT NULL,
  `usergroup` int(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=utf8 COLLATE=utf8_danish_ci AUTO_INCREMENT=8 ;


*********************************************

hvis du kaldte dine felter det sammen ville din sql nok virke, du burde får en sql fejl

så denne linje

if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `password`, `usergroup`) VALUES (?, ?, ?, ?)")) {


skal se sådan ud

if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `userpw`, `usergroup`) VALUES (?, ?, ?, ?)")) {



>- Password vil blive krypteret. Men lige nu lærer jeg blot.
OK, bare du er opmærksom på det, og retter når testen virker

>- Hvordan laver du quotes omkring den kode du poster her på Eksperten?
http://www.eksperten.dk/guide/1325

jeg smider næsten altid min code ind i sådanne tag
(div)(pre) her er min code, eller andet (/pre)(/div)
dette giver en blå box med en scroll bar i bunden


Husk at erstatte alle ( med [ og alle ) med ]


>- Bør jeg bruge $mysqli->close(); efter hver gang jeg har lavet en query?
hvis du husker at åbne en ny database connection hver gang du laver et sql kald så ja,
nogle går det at de åbner database connection'en når de går ind på siden, og bruger ikke $mysqli->close(); da den automatisk lukkes, når php er udført

>- Hvordan tilføjer jeg fejlbeskrivelse hvis en query fejler?
http://www.eksperten.dk/guide/1479
Avatar billede Tobleronealfen Nybegynder
28. april 2016 - 12:14 #11
Jeg tror jeg fik copy-pasted lidt for hurtigt. Feltnavnet er ændret til 'userpw'
Men jeg får ingen fejl når jeg kører koden.
<?php

// test data
$newname = "RonOls";
$newemail = "ronols@olsensweb.dk";
$newpassword = "1234"; // skal krypteres med feks sha512
$newusergroup = TRUE;

if ($newusergroup == TRUE) {
    $newusergroupname = "Administrator";
    $newusergroupid = 1;
} else {
    $newusergroupid = 2;
};

// Kontrol af variabler
echo '<p>Dette er brugernavnet: ' . $newname . '</p>';
echo '<p>Dette er emailadressen: ' . $newemail . '</p>';
echo '<p>Dette er adgangskoden: ' . $newpassword . '</p>';
if ($newusergroupid == 1) {
    echo '<p>Brugeren er ' . $newusergroupname . '</p>';
} else {
    echo '<p>Brugeren er ikke administrator.</p>';
};

/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `userpw`, `usergroup`) VALUES (?, ?, ?, ?)")) {

    /* bind parameters for markers */
  $stmt->bind_param("sssi", $newname, $newemail, $newpassword, $newusergroupid);
 
  /* execute query */
  $stmt->execute();

  /* close statement */
  $stmt->close();
} else {
    echo 'Noget gik galt...' . $mysqli->error;
};

/* close connection */
$mysqli->close();
?>
Avatar billede olsensweb.dk Ekspert
28. april 2016 - 14:48 #12
man skulle tro du har slået error_reporting og display error fra, jeg plejer at have en debugheader indlæset i toppen af mine documenter, der slå det til


jeg har tested din code, med det sql dump fra #9, og den virker !!,


connection.php
 
<?php
$mysqli = new mysqli("localhost", "root", "", "test");

/* check connection */
if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}
?>


debugheader.php

<?php
define('IN_DEBUG_MODE', true); // Sæt til false i production mode
if(IN_DEBUG_MODE){
    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);
}
else{
// Turn off all error reporting
error_reporting(0);
}
?>



 
<?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");


// test data
$newname = "RonOls";
$newemail = "ronols@olsensweb.dk";
$newpassword = "1234"; // skal krypteres med feks sha512
$newusergroup = TRUE;

if ($newusergroup == TRUE) {
    $newusergroupname = "Administrator";
    $newusergroupid = 1;
} else {
    $newusergroupid = 2;
}

// Kontrol af variabler
echo '<p>Dette er brugernavnet: ' . $newname . '</p>';
echo '<p>Dette er emailadressen: ' . $newemail . '</p>';
echo '<p>Dette er adgangskoden: ' . $newpassword . '</p>';
if ($newusergroupid == 1) {
    echo '<p>Brugeren er ' . $newusergroupname . '</p>';
} else {
    echo '<p>Brugeren er ikke administrator.</p>';
}


// conection SKAL indlæsses, og kan indlæsses flere gange da du lukker din connection efter hvert sql kald ( $mysqli->close(); )
require('connection.php');
/* create a prepared statement */
if ($stmt = $mysqli->prepare("INSERT INTO `users` (`username`, `email`, `userpw`, `usergroup`) VALUES (?, ?, ?, ?)")) {

    /* bind parameters for markers */
  $stmt->bind_param("sssi", $newname, $newemail, $newpassword, $newusergroupid);
 
  /* execute query */
  $stmt->execute();

  /* close statement */
  $stmt->close();
} else {
    echo 'Noget gik galt...' . $mysqli->error;
}

/* close connection */
$mysqli->close();
?>




nyttige link
http://php.net/manual/en/function.error-reporting.php
http://php.net/manual/en/function.ini-set.php

http://php.net/manual/en/function.include.php
http://php.net/manual/en/function.include-once.php
http://php.net/manual/en/function.require.php
http://php.net/manual/en/function.require-once.php
Avatar billede Tobleronealfen Nybegynder
28. april 2016 - 17:02 #13
Så lykkedes det!

Jeg tror det var require('connection.php'); der gjorde udfaldet.

Og mange tak for din tid og hjælp med mine spørgsmål!
Skriv et svar, så giver jeg dig de beskedne point :o)
Avatar billede olsensweb.dk Ekspert
28. april 2016 - 17:26 #14
du får et svar her.
men det bør være en deler både arne_v og jakobdo havde fornuftige indput.

@arne_v, og jakobdo læg et svar også så vi kan dele

@Tobleronealfen vent lige på at de 2 andre har lagt et svar/komentar, før du godkender mit svar
Avatar billede arne_v Ekspert
01. maj 2016 - 02:57 #15
svar

men ronols har vist trukket det tungeste laes 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