Problem mit PDO

Warum gibst du die Elemente, die du an das Statement binden willst, nicht mittels Array and die Methode?

PHP:
function db_abfrage($sql_request, arguments = array()){ 
}

Dann musst du innerhalb der Methode nicht so einen Krampf machen, und den Query-String auseinander nehmen. Das ist enorm fehler-anfällig.
 
gute idee :) hab ich schnell umgesetzt ... bleibt nur leider nach wie vor das problem mit dem *("(?#+%& INSERT befehl -.- ... das problem ist er fügt ja werte ein nur leider immer eine variable für alle felder ... !

gruß und schon mal vielen dank bis hierhin!
 
Versuch es mal so:

PHP:
$query = 'INSERT INTO news_id (title,time,author,text) VALUES (:val1, :val2, :val3, :val4)';

db_abfrage($query, arguments = array(
  'val1' => 'test news',
  'val2' => date('dMY'),
  'val3' => 'ich',
  'val4' => 'text text'
));

Innerhalb der Methode baust du noch die foreach-Schleife um:

PHP:
foreach($sql_var_array AS $key => $var){
  $stmt->bindParam(":$key", $var);
}
 
das problem ist das ich das ganze iegtnlich automatisch verarbeiten wollte ... sprich die variablen mit ? ansprechen ...

PHP:
foreach($var_array AS $var){
			$stmt->bindParam($i, $var);
			$i++;
			}

da ich am anfang noch nicht weiss wieviele variablen ich übergeben möchte/muss ... das seltsame daran ist ja das die anderen statments genau so funktionieren :confused:
 
tja auch nach der kleinen korrektur wieder mein rätsel ... er legt jetzt einen daten satz an .. füllt ihn aber nur mit dem letzten value was ich ihm übergebe... ich füge einfach nochmal den aktuellen code an...


die push funktion:
PHP:
function push_news($title,$text){
		$user = $_SESSION['user_nickname'];
		$request = 'INSERT INTO news_id (title, time, author, text, id) VALUES (:val1, :val2, :val3, :val4, :val5)';
		$var_array = array('val1' => $title, 'val2' => 'Datum', 'val3' => 'user', 'val4' => $text, 'val5' => "0");
		//print_r($var_array);
		$daten = db_abfrage($request,$var_array);
	}



die db funktion:

PHP:
function db_abfrage($sql_request, $var_array=array()){
	
		global $sql_user;
		global $sql_pass;
		global $sql_db;
		global $gl_error;
		global $gl_error_text;
		
		
		$test ="test";
			try{
				$dbc = new PDO("mysql:host=localhost;dbname=web2s8874sql1", $sql_user, $sql_pass);
			}
			catch(PDOException $e){
				$gl_error=1;
				array_push($gl_error_text, 'Fehler: '.$e->getMessage);
			}
			$stmt=$dbc->prepare($sql_request);
			$i=1;
			print_r($var_array);

			foreach($var_array AS $key => $var){
			echo "<br>".$i.":".$key.":".$var;
			$stmt->bindParam(":$key", $var);
			$i++;
			}
			if($stmt->execute()){
				$data=$stmt->fetchAll();
				return $data;
			}
			else{
				$gl_error=1;
				$error_info = $stmt->errorInfo();
				array_push($gl_error_text, 'Fehlercode: '.$error_info[0].' : '.$error_info[2]);
			}
			$result=null;
			$stmt=null;
			$dbc=null;
		}
 
Das liegt an folgender Tatsache:

Binds a PHP variable to a corresponding named or question mark placeholder in the SQL statement that was use to prepare the statement. Unlike PDOStatement::bindValue(), the variable is bound as a reference and will only be evaluated at the time that PDOStatement::execute() is called.

Das heißt, du solltest an dieser Stelle lieber bindValue() statt bindParam verwenden. bindParam() bindet die Variable $var an das Tag "var1", "var2"... Das heißt das jede Spalte den Wert der variablen $var übernehmen wird. Und zwar zum Zeitpunkt, an dem execute() gerufen wird.
 
DANKE es funktioniert :D :D :D

da hätte ich auch selber drauf kommen können xD ... hab das kleingedruckte überlesen!!

Danke!!

Gruß christoph
 
Zurück