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


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


$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?
- SanThe - op 01/07/2015 19:27:47

[quote="- 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.".
[/quote]
Jep. Zonder die single-quotes dan uiteraard ;-)
OK.

Als $col leeg is, welke foutmelding wordt er dan gegeven?
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?
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.


<?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.


<?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.
Op diverse plaatsen gebruik je = in een if().
Een = is een toekenning en geen vergelijking.
Een vergelijking is == of ===.
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?
misschien is het ook handig om op regel 5

<?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 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.



	
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.

<?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.

<?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

[quote="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.



	
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.

<?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.

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

?>
[/quote]

Ivo P op 02/07/2015 14:04:10

misschien is het ook handig om op regel 5

<?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:


Array
(
    [kolom2] => thee
)


ik heb de regel geplaatst na :


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


hoe dat met omgekeerde vraagtekens zit weet ik niet.
Die typte hij met opzet zodat hij geen blok code kreeg, maar jouw wel goed kan uitleggen dat je [ignore]<?php en ?>[/ignore] moet gebruiken.

Dan krijg je automatisch dit:

<?php
// zie je?
?>

Reageren