PDO prepare gibt false zurück

para_noid

hirnrissig
Und ich kann mir nicht erklären, warum.

PHP:
$sql = "INSERT INTO product_data
	(product_id, supplier_id, price, stock)
	VALUES(?,?,?,?);";

if($statement = $this->db->prepare($sql)){
        /*
	$i = 0;
	while(list($productid, $value) = each($this->insert)){
		if(!$statement->execute(array(
                      0 => $productid, 
                      1 => $this->supplierid, 
                      2 => $value['price'], 
                      3 => $value['stock'])))
			print_r($statement->errorInfo());
	
		$i++;
	}
	echo $i.' Preise und Bestände eingefügt';
        */
}else echo 'prepared: false';

gibt mir immer "prepared: false" aus. Ich habe sowohl das PHP-Errorreporting wie auch das von PDO an:
PHP:
	$this->db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);

Wenn ich statt dem echo ein errorInfo() hinsetze bekomm ich das:

Code:
Array
(
    [0] => 00000
    [1] => 0
    [2] =>  (SQLPrepare[0] at /build/buildd/php5-5.3.2/ext/pdo_odbc/odbc_driver.c:206)
    [3] => 
)
wo ich mir sage, Fehlercode 0 dürfte dann kein Fehler heißen?
Hat jemand vielleicht 'ne Idee was hier schiefläuft? Normale Queries laufen ohne Probleme.
 
Der Rückgabewert ist false.


$this->db ist ein Objekt der PDO-Klasse. Mit ihm führe ich früher im Script bereits normale Queries durch, wie z.B.:

PHP:
$sql = "SELECT supplierProduct_id, product_id, price, stock FROM product_data
		WHERE supplier_id= ".$this->supplierid.";";
if($r = $this->db->query($sql)){
	if($r->columnCount() > 0){
		while($row = $r->fetch()) {
			$this->pricesAndStocks[$row['supplierProduct_id']] = $row;
		}
	}
	$r->closeCursor();
}

Das Array pricesAndStocks ist entsprechend befüllt. An $this->db wird danach auch nix mehr gedreht :(
 
PHP:
$sql = "INSERT INTO product_data
    (product_id, supplier_id, price, stock)
    VALUES(1,1,1,1);";
 
if($statement = $this->db->query($sql)){
        /*
    $i = 0;
    while(list($productid, $value) = each($this->insert)){
        if(!$statement->execute(array(
                      0 => $productid, 
                      1 => $this->supplierid, 
                      2 => $value['price'], 
                      3 => $value['stock'])))
            print_r($statement->errorInfo());
    
        $i++;
    }
    echo $i.' Preise und Bestände eingefügt';
        */
}else echo 'prepared: false';

Und so funktioniert das ganze? (Nur um auszuschließen, dass sich da nicht irgendwo ein logischer Fehler eingeschlichen hat.)

Edit: Du benutzt aber schon MySQL, oder? "/build/buildd/php5-5.3.2/ext/pdo_odbc/odbc_driver" spricht für was anderes...
 
Zuletzt bearbeitet:
Wie hab ich denn vorhin die Meldung überlesen?...
Zugriff per ODBC geht auch ist nur ungewöhnlich.

Tritt das ganze auch auf, wenn Du statt "?" das ":name" verwendest und die Variablen per bindValue zuweist?
 
Zuletzt bearbeitet:
Edit: Du benutzt aber schon MySQL

Ähm, nein. War mir nicht im Klaren darüber, ob das wichtig ist (hab das Problem bislang auf PDO bezogen). Ich nutze FreeTDS & unixODBC um von einem UbuntuLinux auf den SQL-Server einer Windowsmaschine zuzugreifen (bevor einer fragt: unfreiwllig).

Ich komm erst morgen wieder an den Rechner; werd dann sowohl das mit query() wie auch die anderen Platzhalter testen und mich dann nochmal melden. Danke erstmal.
 
Von der PDO-Klasse. Das Statement existiert an der Stelle ja noch nicht.

@ alxy query() schlägt genauso fehl wie prepare.
Jetzt hab ich aber gesehen, dass ich ne falsche Spaltenbezeichnung drin hatte bzw eine Spalte fehlte, weil die nicht NULL sein darf. Das hab ich aber nur aus'm SQL Server direkt erfahren, die Fehlermeldungen von PDO sind ja eher...nutzlos.

Nach Einsicht in den SQLServer hab ich's jetz in 'nem Testscript hinbekommen:

PHP:
ini_set('display_errors', 1);
error_reporting(E_ALL);

require_once('config/config.php');

try{
  $db = new PDO('odbc:Driver=FreeTDS; Server='.DB_ARTIKEL_HOST.'; Port='.DB_ARTIKEL_PORT.'; Database='.DB_ARTIKEL_DB.'; UID='.DB_ARTIKEL_USER.'; PWD='.DB_ARTIKEL_PASS.';');
}catch(PDOException $exception){
  die("Unable to open database.<br>Error message:<br><br>$exception.");
}



$sql = "INSERT INTO product_data
			(product_id, supplier_id, supplier_product_id, price, stock)
			VALUES(1,1,1,1,1);";
if($statement = $db->query($sql)){
	echo "jippieh!";
}else echo 'no query';




$sql = "INSERT INTO product_data
			(product_id, supplier_id, supplier_product_id, price, stock)
			VALUES(?,?,?,?,?);";
if($statement = $db->prepare($sql)){
	for($i = 2; $i<12; $i++){
		if(!$statement->execute(array(1,1,$i,1,1)))
			echo 'no execute: '.print_r($statement->errorInfo(), true)."\n";
	}	
}else echo 'no prepare';

Ich kann mit das errorInfo halt komplett sparen. Egal welcher Fehler seitens des SQLServers nun eigentlich auftritt, null-Wert in NOTNULL-Spalte oder doppelter PrimaryKey, ich krieg immer nur sowas:

Ausgabe:

Code:
Array
(
    [0] => 00000
    [1] => 0
    [2] =>  (SQLExecute[0] at /build/buildd/php5-5.3.2/ext/pdo_odbc/odbc_stmt.c:254)
    [3] => 00000
)

:/


Grundfrage ist aber erstmal erledigt, danke an alle. Ich muss halt für die weitere Arbeit parallel im SQLServer testen.
 
Zuletzt bearbeitet:
Zurück