SPiNMedlem sedan mars 20007 896 inlägg Hej!
Jag har ett prepared statement som jag vill köra, för att lägga till diverse information i en databas. Problemet ligger i att ingenting läggs till i databasen och jag får inte något felmeddelande. Det är en INSERT-fråga där jag ska fylla 13 fält i databasen, alltså binder jag upp 13 parametrar till mitt PDO-statement. Tar jag färre, 2-4 parametrar, fungerar det självklart ypperligt. Finns det några sätt i PHP (inte SQL) att få PDO att bete sig som det ska? Eller måste jag gå omvägen att uppdatera raden i databasen med mer information?
Felmeddelanden i PDO är normal "tysta".
Använd pdo::setAttribute() för att ändra detta. http://se.php.net/manual/en/function.PDO-setAttribute.php
Eller så tittar du på felet med pdo::errorInfo()
http://se.php.net/manual/en/function.PDO-errorInfo.php
Kan du visa lite kod?
SPiNMedlem sedan mars 20007 896 inlägg Jag har redan ändrat attributet till att visa felmeddelanden och varningar. PDO:errorInfo() fungerar inte på prepared statements, utan bara direkt på PDO-objektet.
$pdh = new PDO("mysql:host=localhost;dbname=**", "**", "**");
...
$stmt = $pdh->prepare("INSERT INTO tbl (field1, field2...) VALUES(:field1, : field2...)");
$stmt->bindParam(":field1", $value1);
$stmt->bindParam(":field2", $value2);
...
Inga konstigheter. Det fungerar när jag bara har lägger in några stycken värden, men 13 stycken verkar vara för mycket att hantera. Det finns ingen fördefinierad övre gräns på hur många parameter ett statement kan ta, som man kan ändra på?
Jag har inget egentligt mellanslag mellan : och field2 i frågan, wF verkar vilja lägga in en smiley där - därför mellanslaget. ;)
SPiNMedlem sedan mars 20007 896 inlägg Pinsamt att erkänna det, men man måste ha koll på längden i ens databasfält... :r
Här skäller jag på utvecklarna av PDO-funktionaliteten, också ligger felet i att jag har deklarerat ett fält i databasen med längden 8 som måste ta en längd på 9 tecken. ;)
För att försvara mig lite, så måste jag säga att det är märkligt att man inte får några felmeddelanden - trots att man ber om dom.
SPiN skrev:
Jag har redan ändrat attributet till att visa felmeddelanden och varningar. PDO:errorInfo() fungerar inte på prepared statements, utan bara direkt på PDO-objektet.
Förlåt: PDOStatement::errorInfo() menade jag: http://se.php.net/manual/en/function.PDOStatement-errorInfo.php
Och du behöver inte försvara dig. Ingen anklagelse föreligger. Mina frågor handlar endast om att försöka hitta ditt problem, som är nytt för mig. Här kommer fler frågor...
1. Är det jag ser äkta kod eller pseudokod? (Jag misstänker att du inte kallar dina tabellfält för field1, field2, osv utom när du övar?)
2. Har du hittat en kritisk nivå där det slutar fungera, dvs. har du testat med 4, 5, 6, 7... parametrar tills felet uppstår?
3. Kan du visa hela det relevanta kodblocket samt tabellens struktur? Annars är det svårt att replikera ditt fel.
4. Vilken version av PHP och MySQL kör du - och på vilket OS? Vi kan ju ha stött på en bugg i PDO. Testa följande:
echo "<p>Database Server Version: ",$pdh->getAttribute(PDO::ATTR_SERVER_VERSION),"</p>\n";
echo "<p>Client Library Server Version: ",$pdh->getAttribute(PDO::ATTR_CLIENT_VERSION),"</p>\n";
echo "<p>Misc Server information: ",$pdh->getAttribute(PDO::ATTR_SERVER_INFO),"</p>\n";
echo "<p>Connection Status: ",$pdh->getAttribute(PDO::ATTR_CONNECTION_STATUS),"</p>\n";
Oj, under tiden jag skrev mina frågor skrev du själv ett svar. Kan du upprepa ditt fel igen och köra PDOStatement::errorInfo() bara för att se om det fungerar, för min skull?
SPiNMedlem sedan mars 20007 896 inlägg Jag förstod det sedan, att du menade PDOStatement::errorInfo() - men jag hade redan försökt med det också.
Jag sitter i Windows med Apache 2.2.4, MySQL 5.0.45 och PHP 5.2.3.
Databasens utseende:
CREATE DATABASE testdb;
USE testdb;
GRANT ALL PRIVILEGES ON testdb.* TO '***'@'localhost'
IDENTIFIED BY '***' WITH GRANT OPTION;
CREATE TABLE tbl (
id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
testfld VARCHAR(20),
shortfld VARCHAR(5)
);
PHP-sidan:
try {
$pdh = new PDO("mysql:host=localhost;dbname=testdb", "***", "***");
/* Har försökt med och utan att sätta attribut */
$pdh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_WARNING);
$param1 = "Test";
$param2 = "This-is-just-a-test";
$stmt = $pdh->prepare("INSERT INTO tbl (testfld, shortfld) VALUES(?, ?)");
$stmt->bindParam(1, $param1);
$stmt->bindParam(2, $param2);
$stmt->execute();
print_r($stmt->errorCode());
print_r($stmt->errorInfo());
$pdh = null;
} catch(PDOException $e) {
echo $e->getMessage();
}
Jag har under ett tag försökt att få felhanteringen att skrika ut någonting, men inte ens om databasen inte existerar får jag några felmeddelanden.
Jag får inget i retur från getAttribute()-funktionen heller.
hmm .. enligt http://se.php.net/pdo
så skall felet visas, det kan inte påverka om du sätter ut die() efter echo $e->getMessage();
colioneMedlem sedan juni 20014 421 inlägg $pdh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
SPiNMedlem sedan mars 20007 896 inlägg Det verkar som att min server hade hängt sig på något sätt bara. Efter en omstart skickar den ut alla felmeddelanden man vill ha.
bra att det löste sig! :)