PHP/MYSQL: (double) quotes en backticks ???

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Pagina: 1 2 3 volgende »

Johan West

Johan West

01/07/2015 16:48:08
Quote Anchor link
PHP/MYSQL is vrij onlogisch in het toepassen van quotes, double qoutes en backticks zoals " ' ` .

Als ik CREATE TABLE `$var` doe dan werkt dat, maar bij een andere query zoals INSERT INTO niet.

Ik krijg de volgende foutmelding

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
Fout:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''.` `.' (linkoms, linkadd) VALUES ( 'aaa', 'http://www.aa.com' )' at line 1
zijn toegevoegd aan de database (regel 2)


als gevolg van deze code

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = "INSERT INTO '.`$col`.' (linkoms, linkadd) VALUES (  '". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
  '". $conn->real_escape_string($_POST['linkadd'][$key]) ."' )";



Iemand enig idee hoe $col in een INSERT INTO query zou moeten?
 
PHP hulp

PHP hulp

25/04/2024 18:11:59
 
- Ariën  -
Beheerder

- Ariën -

01/07/2015 16:57:33
Quote Anchor link
Backticks moet je eigenlijk nooit gebruiken. Verder pas je het nu toe in het PHP-gedeelte, wat sowieso niet hoort.

Als je $sql eens echo'en, dan zie je precies hoe de query eruit ziet.
 
Pipo Clown

Pipo Clown

01/07/2015 17:00:21
Quote Anchor link
Probeer onderstaande eens.
Ik ben er van uit gegaan dat beide values een niet getal zijn.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
$sql = 'INSERT INTO "'.$col.'" (linkoms, linkadd) VALUES ( "'. $conn->real_escape_string($_POST['linkoms']['.$key.']) .'",
  "'. $conn->real_escape_string($_POST['linkadd']['.$key.']) .'" )';


met echo($sql) kun je kijken of de query er goed uit ziet.
 
Ivo P

Ivo P

01/07/2015 17:09:41
Quote Anchor link
je probleem zit niet zo zeer in Mysql, als wel in PHP:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$sql
= "INSERT INTO '.`$col`.' (linkoms, linkadd) VALUES (  '". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
  '"
. $conn->real_escape_string($_POST['linkadd'][$key]) ."' )";
?>


je begint de string met ", aar na INTO sluit je de string af met '

Toevoeging op 01/07/2015 17:10:04:

zie ook hoe $col rood kleurt ipv blauw
 
Johan West

Johan West

01/07/2015 19:07:11
Quote Anchor link
dit is de sql output

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
Fout: INSERT INTO '.` `.' (linkoms, linkadd) VALUES ( 'aa', 'http://www.aa.com' )
 
- SanThe -

- SanThe -

01/07/2015 19:22:32
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
$sql
= "INSERT INTO ".$col." (linkoms, linkadd) VALUES (  '". $conn->real_escape_string($_POST['linkoms'][$key]) ."',
  '"
. $conn->real_escape_string($_POST['linkadd'][$key]) ."' )";
?>
 
- Ariën  -
Beheerder

- Ariën -

01/07/2015 19:23:41
Quote Anchor link
Wat Ivo dus zegt, gebruik na je INTO dit:

"'.$col.'"
 
- SanThe -

- SanThe -

01/07/2015 19:27:47
Quote Anchor link
- Aar - op 01/07/2015 19:23:41:
Wat Ivo dus zegt, gebruik na je INTO dit:

"'.$col.'"


Nee, want het is een colomnnaam, dus ".$col.".
 
Johan K

Johan K

01/07/2015 19:29:13
Quote Anchor link
Persoonlijk hou ik er van om mijn SQL code zo kort mogelijk te houden zodat het leesbaar is.
Wat ik in jouw SQL query niet echt begrijp is: INSERT INTO '.`$col`.'

Wat probeer je hier te doen? Je insert in een tabel, linkoms & linkadd zijn jouw 'cols'. Daarbij moet je MySQL reserved keywords niet gebruiken zodat je ook geen backticks hoeft te gebruiken en die puntjes snap ik ook niet echt.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
  $oms
= $conn->real_escape_string($_POST['linkoms'][$key]);
  $add = $conn->real_escape_string($_POST['linkadd'][$key]);

  $sql = "INSERT INTO $col (linkoms, linkadd) VALUES ('$oms', '$add')";
?>


Dat ziet er al veel overzichtelijker uit, backticks "`" moet je alleen gebruiken als je er echt niet onderuit komt dat er een mysql resverved keyword word gebruikt.
https://dev.mysql.com/doc/refman/5.5/en/keywords.html

En logischer zal zijn dat je de variable "$col" een betere naam geeft.
 
Ivo P

Ivo P

01/07/2015 20:28:31
Quote Anchor link
- SanThe - op 01/07/2015 19:27:47:

Nee, want het is een colomnnaam, dus ".$col.".


Een tabelnaam dus eigenlijk
 
Johan West

Johan West

01/07/2015 23:28:28
Quote Anchor link
Ivo P op 01/07/2015 20:28:31:
- SanThe - op 01/07/2015 19:27:47:

Nee, want het is een colomnnaam, dus ".$col.".


Een tabelnaam dus eigenlijk


Nee het is geen database kolom. Maar voor de fp layout kun je soms ook een kolom hebben. Maar het is dus idd een tabel genaamd $col als variabele.

Maar welke manier ik ook probeer het lukt niet om de $col in de query te krijgen.
 
- Ariën  -
Beheerder

- Ariën -

01/07/2015 23:31:05
Quote Anchor link
- SanThe - op 01/07/2015 19:27:47:
- Aar - op 01/07/2015 19:23:41:
Wat Ivo dus zegt, gebruik na je INTO dit:

"'.$col.'"


Nee, want het is een colomnnaam, dus ".$col.".

Jep. Zonder die single-quotes dan uiteraard ;-)
Gewijzigd op 01/07/2015 23:31:18 door - Ariën -
 
Johan West

Johan West

02/07/2015 08:24:22
Quote Anchor link
OK.

Als $col leeg is, welke foutmelding wordt er dan gegeven?
 
Thomas van den Heuvel

Thomas van den Heuvel

02/07/2015 09:06:52
Quote Anchor link
Als het een table betreft, noem dat ding dan $table ofzo om spraakverwarring te voorkomen.

Kunnen we ook terug naar de oorspronkelijke probleemstelling?

Waar loop je nu nog concreet tegenaan? Wat heb je geprobeerd? Welke foutmelding(en) krijg je?
 
Johan West

Johan West

02/07/2015 11:05:53
Quote Anchor link
OK in het vlg. script heb ik $col veranderd in $tab.

Het volgende is het probleem.

Ik kan met var_dump($tab) aantonen dat $tab gevuld is, maar niet binnen een bepaalde beslissingsconditie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
<?php
// verbinding maken
// gegevens ophalen


if ($_SERVER['REQUEST_METHOD'] == 'POST') {

if( isset ($_POST['kolom2']) && ($tab = " " ) ) { // deze regel kan niet toegevoegd worden aan de vlg. if conditie
    $tab = $_POST['kolom2'];

    var_dump($tab); // deze var_dump wordt gewoon afgedrukt

If (isset($_POST['linkoms']) && (is_array($_POST['linkoms'])) && ($linkoms = " ") && isset($_POST['linkadd'])
            && (
is_array($_POST['linkadd'])) && ($linkadd = " ")  ) {

// hier wordt var_dump niet afgedrukt
//

        
foreach($_POST['linkoms'] as $key => $dummy) {


 $oms = $conn->real_escape_string($_POST['linkoms'][$key]);
 $add = $conn->real_escape_string($_POST['linkadd'][$key]);

  $sql = "INSERT INTO " . $tab . " (linkoms, linkadd) VALUES (`$oms`, `$add`)" ;
  
if ($conn->query($sql) === TRUE)
                                {
echo  "De links zijn toegevoegd aan de database.  ";
                            echo "<br>";
                            echo $tab;
                                    
                            }
else {
            echo "Fout: " . " $sql " . " <br>" . $conn->error;
            }

            echo "<br>" . " tekst";
            }

        }

    else {  echo "<center>";
            echo "we wachten op uw invoer";
            echo "</center>";
            }
} }


?>


Dus na de if request een nwe if (isset) .. hierbinnen kan ik wel var_dump gebruiken.
Plaats ik de volgende regel echter in de daarop volgende if conditie dan doet hij niets.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
<?php
if( isset ($_POST['kolom2']) && ($tab = " " ) ) {
    $tab = $_POST['kolom2'];
?>


In een eerder deel van het script heb ik dezelfde condities gebruikt om kolom2 (dit gaat in een tabel :) ) op te halen en zonder problemen, maar als ik dit binnen de vereiste conditie doe of er buiten om heen dan werkt het niet.
Gewijzigd op 02/07/2015 18:09:01 door Johan West
 
- SanThe -

- SanThe -

02/07/2015 11:11:22
Quote Anchor link
Op diverse plaatsen gebruik je = in een if().
Een = is een toekenning en geen vergelijking.
Een vergelijking is == of ===.
 
Thomas van den Heuvel

Thomas van den Heuvel

02/07/2015 13:48:04
Quote Anchor link
Waarom moet eenzelfde soort informatie trouwens opgeslagen worden in verschillende tabellen?

Ben je het probleem -wat dit ook moge zijn- niet op de verkeerde plaats aan het oplossen?

Welke waarden kan de tabelnaam allemaal hebben? En waarom deze aanpak?
 
Ivo P

Ivo P

02/07/2015 14:04:10
Quote Anchor link
misschien is het ook handig om op regel 5

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo '<pre>' . print_r($_POST, 1) . '</pre>';'?>


te plaatsen om te zien wat er eigenlijk gedaan moet gaan worden met welke data

En gebruik bij jouw code hier op de site ook eens <¿php en ¿> om de kleurtjes te krijgen bij je posts
 
Johan K

Johan K

02/07/2015 14:39:20
Quote Anchor link
Johan West op 02/07/2015 11:05:53:
OK in het vlg. script heb ik $col veranderd in $tab.

Het volgende is het probleem.

Ik kan met var_dump($tab) aantonen dat $tab gevuld is, maar niet binnen een bepaalde beslissingsconditie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
    
foreach($_POST['linkoms'] as $key => $dummy) {


 $oms = $conn->real_escape_string($_POST['linkoms'][$key]);
 $add = $conn->real_escape_string($_POST['linkadd'][$key]);

  $sql = "INSERT INTO " . $tab . " (linkoms, linkadd) VALUES (`$oms`, `$add`)" ;
  


Dan geef ik je een prima werkende SQL lijn en dan ga je weer backticks gebruiken en dan nog wel om de values heen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
  
  $sql
= "INSERT INTO ".$tab." (linkoms, linkadd) VALUES ('".$oms."', '".$add."')";
  
  // is hetzelfde als:
  $sql = "INSERT INTO $tab (linkoms, linkadd) VALUES ('$oms', '$add')";


?>


In PHP, een string met "mijnstring" accepteerd variabelen en zet deze automatisch om.
Een string met 'mijnstring' (een litaral string) doet dat dus niet.
Aangezien VALUES in SQL moeten worden aangegeven met single quotes worden meestal toch double quotes gebruikt voor de complete SQL string dus maak er dan ook gebruik van.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
  // verbinding maken
  // gegevens ophalen


  if($_SERVER['REQUEST_METHOD'] == 'POST'){
    if(isset($_POST['kolom2']) && ($tab = " " )){ // deze regel kan niet toegevoegd worden aan de vlg. if conditie
      $tab = $_POST['kolom2'];

      var_dump($tab); // deze var_dump wordt gewoon afgedrukt

      echo gettype($_POST['linkoms']) // waarschijnlijk een string of integer.
      echo gettype($_POST['linkadd']) // waarschijnlijk een string of integer.

      if(isset($_POST['linkoms']) && (is_array($_POST['linkoms'])) && ($linkoms = " ") && isset($_POST['linkadd']) && (is_array($_POST['linkadd'])) && ($linkadd = " ")){
        //hier wordt var_dump niet afgedrukt
        // omdat deze "if" statement false is, dus voert hij het else gedeelte uit.

      
        foreach($_POST['linkoms'] as $key => $dummy) {

          $oms = $conn->real_escape_string($_POST['linkoms'][$key]);
          $add = $conn->real_escape_string($_POST['linkadd'][$key]);
          $sql = "INSERT INTO " . $tab . " (linkoms, linkadd) VALUES (`$oms`, `$add`)" ;
  
          if($conn->query($sql) === TRUE){
            echo  "De links zijn toegevoegd aan de database.  <br>$tab";                                  
          }
else {
            echo "Fout: " . " $sql " . " <br>" . $conn->error;
          }

          echo "<br>" . " tekst";
        }
      }
else {
        echo "<center>we wachten op uw invoer</center>";
      }
    }
  }


?>


Toevoeging op 02/07/2015 15:06:05:

Johan K op 02/07/2015 14:39:20:
Johan West op 02/07/2015 11:05:53:
OK in het vlg. script heb ik $col veranderd in $tab.

Het volgende is het probleem.

Ik kan met var_dump($tab) aantonen dat $tab gevuld is, maar niet binnen een bepaalde beslissingsconditie.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
    
foreach($_POST['linkoms'] as $key => $dummy) {


 $oms = $conn->real_escape_string($_POST['linkoms'][$key]);
 $add = $conn->real_escape_string($_POST['linkadd'][$key]);

  $sql = "INSERT INTO " . $tab . " (linkoms, linkadd) VALUES (`$oms`, `$add`)" ;
  


Dan geef ik je een prima werkende SQL lijn en dan ga je weer backticks gebruiken en dan nog wel om de values heen.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
<?php
  
  $sql
= "INSERT INTO ".$tab." (linkoms, linkadd) VALUES ('".$oms."', '".$add."')";
  
  // is hetzelfde als:
  $sql = "INSERT INTO $tab (linkoms, linkadd) VALUES ('$oms', '$add')";


?>


In PHP, een string met "mijnstring" accepteerd variabelen en zet deze automatisch om.
Een string met 'mijnstring' (een litaral string) doet dat dus niet.
Aangezien VALUES in SQL moeten worden aangegeven met single quotes worden meestal toch double quotes gebruikt voor de complete SQL string dus maak er dan ook gebruik van.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
<?php
  // verbinding maken
  // gegevens ophalen


  if($_SERVER['REQUEST_METHOD'] == 'POST'){
    if(isset($_POST['kolom2']) && ($tab = " " )){ // deze regel kan niet toegevoegd worden aan de vlg. if conditie
      $tab = $_POST['kolom2'];

      var_dump($tab); // deze var_dump wordt gewoon afgedrukt

      echo gettype($_POST['linkoms']) // waarschijnlijk een string of integer.
      echo gettype($_POST['linkadd']) // waarschijnlijk een string of integer.

      if(isset($_POST['linkoms']) && is_array($_POST['linkoms']) && $linkoms = " " && isset($_POST['linkadd']) && is_array($_POST['linkadd']) && $linkadd = " "){
        //hier wordt var_dump niet afgedrukt
        // omdat deze "if" statement false is, dus voert hij het else gedeelte uit.

      
        foreach($_POST['linkoms'] as $key => $dummy) {

          $oms = $conn->real_escape_string($_POST['linkoms'][$key]);
          $add = $conn->real_escape_string($_POST['linkadd'][$key]);
          $sql = "INSERT INTO " . $tab . " (linkoms, linkadd) VALUES (`$oms`, `$add`)" ;
  
          if($conn->query($sql) === TRUE){
            echo  "De links zijn toegevoegd aan de database.  <br>$tab";                                  
          }
else {
            echo "Fout: " . " $sql " . " <br>" . $conn->error;
          }

          echo "<br>" . " tekst";
        }
      }
else {
        echo "<center>we wachten op uw invoer</center>";
      }
    }
  }


?>
Gewijzigd op 02/07/2015 15:02:39 door Johan K
 
Johan West

Johan West

02/07/2015 17:15:45
Quote Anchor link
Ivo P op 02/07/2015 14:04:10:
misschien is het ook handig om op regel 5

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<?php echo '<pre>' . print_r($_POST, 1) . '</pre>';'?>


te plaatsen om te zien wat er eigenlijk gedaan moet gaan worden met welke data

En gebruik bij jouw code hier op de site ook eens <¿php en ¿> om de kleurtjes te krijgen bij je posts


Ok de output is:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
Array
(
    [kolom2] => thee
)


ik heb de regel geplaatst na :

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
if ($_SERVER['REQUEST_METHOD'] == 'POST') { ..


hoe dat met omgekeerde vraagtekens zit weet ik niet.
Gewijzigd op 02/07/2015 17:45:16 door Johan West
 
Eddy E

Eddy E

02/07/2015 18:01:50
Quote Anchor link
Die typte hij met opzet zodat hij geen blok code kreeg, maar jouw wel goed kan uitleggen dat je <?php en ?> moet gebruiken.

Dan krijg je automatisch dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
// zie je?
?>
 

Pagina: 1 2 3 volgende »



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.