php.de

Zurück   php.de > Webentwicklung > PHP-Fortgeschrittene

PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 18.02.2005, 19:00  
Gast
 
Beiträge: n/a
Standard [Erledigt] Pear-DB-Abfrage meldet "insufficient data supplied&quot

Moin,

ich arbeite in Pear-DB mit einer vorbereiteten Abfrage a'la prepare und dann execute. In einem Fall bekomme ich aber immer eine Fehlermeldung, die ich mir nicht erklären kann und die ich auch nicht weg bekomme. Der vorbereitete SQL-String ist
Code:
SELECT * FROM sendung_termin WHERE ((TS_beginn BETWEEN ? AND ?) OR (TS_ende BETWEEN ? AND ?) OR (TS_beginn < ? AND TS_ende > ?)) AND Sid != ? ORDER BY TS_beginn
Wenn man den Teil "AND Sid != ?" weglässt (und das übergebene Array entsprechend anpasst) funktionierts... Warum? Die aktuellste Version von Pear-DB hab ich drauf.

Bin für jeden Tipp dankbar.
Gruß
Michael

Hier nochmal der komplette Code. Fehlschlagen tuts halt wenn $auswahl gesetzt ist.
Code:
if ($auswahl != NULL) {
        //DB-Abfrage vorbereiten
        $sql  = "SELECT * FROM sendung_termin ";
        $sql .= "WHERE ((TS_beginn BETWEEN ? AND ?) ";
        $sql .= "OR (TS_ende BETWEEN ? AND ?) ";
        $sql .= "OR (TS_beginn < ? AND TS_ende > ?)) AND Sid != ? ";
        $sql .= "ORDER BY TS_beginn";
    }//if
    else {
        $sql  = "SELECT * FROM sendung_termin ";
        $sql .= "WHERE ((TS_beginn BETWEEN ? AND ?) ";
        $sql .= "OR (TS_ende BETWEEN ? AND ?) ";
        $sql .= "OR (TS_beginn < ? AND TS_ende > ?)) ";
        $sql .= "ORDER BY TS_beginn";
    }//else

    $kompiliert = $db->prepare($sql);

    //Alle Termine durchgehen und DB-Abfrage
    //Termine sind Objekte, die Timestamps beinhalten, die ich halt an 
    // die SQL-Abfrage übergebe.
    foreach ($neueTermine as $ntermin) {
        if ($auswahl != NULL) {
            $werte = array (
                    $ntermin->getTS_beginn(),
                    ($ntermin->getTS_ende()-1),
                    ($ntermin->getTS_beginn()+1),
                    $ntermin->getTS_ende(),
                    $ntermin->getTS_beginn(),
                    $ntermin->getTS_ende(),
                    $auswahl
                    );//array
        }//if
        else {
            $werte = array (
                    $ntermin->getTS_beginn(),
                    ($ntermin->getTS_ende()-1),
                    ($ntermin->getTS_beginn()+1),
                    $ntermin->getTS_ende(),
                    $ntermin->getTS_beginn(),
                    $ntermin->getTS_ende()
                    );//array
        }//else

        $query = $db->execute($kompiliert, $werte);

        if (DB::iserror($query)) {
            echo "Fehler bei Datenbankabfrage.";
         }//if
....
  Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 18.02.2005, 23:04  
Gast
 
Beiträge: n/a
Standard Re: Pear-DB-Abfrage meldet "insufficient data supplied&

Zitat:
Zitat von mbscholz
Der vorbereitete SQL-String ist
Code:
SELECT * FROM sendung_termin WHERE ((TS_beginn BETWEEN ? AND ?) OR (TS_ende BETWEEN ? AND ?) OR (TS_beginn < ? AND TS_ende > ?)) AND Sid != ? ORDER BY TS_beginn
Wenn man den Teil "AND Sid != ?" weglässt (und das übergebene Array entsprechend anpasst) funktionierts... Warum?
Schon mal so getestet (ich verwende PEAR :: DB nicht mehr)?

PHP-Code:
<?php
$sql 
"SELECT * FROM sendung_termin 
WHERE ((TS_beginn BETWEEN ? AND ?) 
OR (TS_ende BETWEEN ? AND ?) 
OR (TS_beginn < ? AND TS_ende > ?)) 
AND Sid != '?' ORDER BY TS_beginn"
# <--
?>
a. Sid riecht nach Zeichenkette
b. ich hab (auf die Schnelle!) in DB.php und common.php nix gefunden, daß Strings mit ' oder " eingerahmt werden.
  Mit Zitat antworten
Alt 19.02.2005, 12:18  
Gast
 
Beiträge: n/a
Standard

Hi,
danke erstmal für die Antwort. Leider war es das nicht...
Ich habe die Abfrage mittlerweile auf ein einfaches "SELECT * FROM sendung_termin WHERE Sid != ?" vereinfacht, aber nicht mal das funzt...
Weiß irgendjemand, ob es noch irgendwas zu beachten gibt bei vorbereiteten Abfragen, was ich übersehen haben könnte?

Danke und Gruß,
Michael
  Mit Zitat antworten
Alt 19.02.2005, 13:46  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von mbscholz
"SELECT * FROM sendung_termin WHERE Sid != ?
Versuch mal != durch <> zu ersetzen.

Gegen was für eine DB lässt Du dieses Query laufen (MySQL, Oracle, etc.)? Und kannst du mal ein describe auf deine Tabelle posten?
  Mit Zitat antworten
Alt 19.02.2005, 15:12  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von mbscholz
danke erstmal für die Antwort. Leider war es das nicht...
Noch mal nachgeguckt:
Code:
DB_ERROR_NEED_MORE_DATA     => 'insufficient data supplied',
Hier der Teil, der den Fehler wirft (DB/common.php):
PHP-Code:
<?php
    
function executeEmulateQuery($stmt$data false)
    {
        
$p = &$this->prepare_tokens;

        if (!isset(
$this->prepare_tokens[$stmt]) ||
            !
is_array($this->prepare_tokens[$stmt]) ||
            !
sizeof($this->prepare_tokens[$stmt]))
        {
            return 
$this->raiseError(DB_ERROR_INVALID);
        }

        
$qq = &$this->prepare_tokens[$stmt];
        
$qp sizeof($qq) - 1;

        if ((!
$data && $qp 0) ||
            (!
is_array($data) && $qp 1) ||
            (
is_array($data) && $qp sizeof($data)))
        {
            
$this->last_query $this->prepared_queries[$stmt];
            return 
$this->raiseError(DB_ERROR_NEED_MORE_DATA);
        }
#
}
?>
  Mit Zitat antworten
Alt 20.02.2005, 11:58  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von noel
Zitat:
Zitat von mbscholz
"SELECT * FROM sendung_termin WHERE Sid != ?
Versuch mal != durch <> zu ersetzen.
Hab ich schon, das gibt interessanterweise eine Endlosschleife...
Interessant ist auch, dass ein einfaches "=" funktioniert, aber kein "!=" - mir kommt da irgendwie der Eindruck das sei ein Bug.
Zitat:
Gegen was für eine DB lässt Du dieses Query laufen (MySQL, Oracle, etc.)? Und kannst du mal ein describe auf deine Tabelle posten?
Ja, das ist MySQL, was anderes hab ich auf dem Server leider nicht zur Verfügung...
Ich hoffe ich verstehe das mit dem Describe richtig:
--
-- Tabellenstruktur für Tabelle `sendung_termin`
--

CREATE TABLE `sendung_termin` (
`Sid` int(5) NOT NULL default '0',
`Lnr` int(7) NOT NULL auto_increment,
`TS_beginn` varchar(10) NOT NULL default '',
`TS_ende` varchar(10) NOT NULL default '',
PRIMARY KEY (`Sid`,`Lnr`)
) TYPE=MyISAM COMMENT='Einzelne Termine einer Sendung' AUTO_INCREMENT=1 ;

Schönen Gruß,
Michael
  Mit Zitat antworten
Alt 20.02.2005, 12:08  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

warum produzierst du einen primärschlüssel über zwei spalten?
axo ist offline   Mit Zitat antworten
Alt 20.02.2005, 12:11  
Gast
 
Beiträge: n/a
Standard

Zitat:
Zitat von axo
warum produzierst du einen primärschlüssel über zwei spalten?
Weil diese Tabelle relational mit einer Tabelle namens sendung verbunden ist, deren PK ist Sid. In sendung stehen Sachen wie Name, Beschreibung etc. zur Sendung, in sendung_termin werden die einzelnen Sendetermine gespeichert.
  Mit Zitat antworten
Alt 20.02.2005, 12:30  
da schreibt der ElePHPant
 
Benutzerbild von Flor1an
 
Registriert seit: 18.06.2008
Beiträge: 8.903
PHP-Kenntnisse:
Fortgeschritten
Flor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer AnblickFlor1an ist ein wunderbarer Anblick
Standard

übrigens hast du bei deinemn order by nicht desc oder asc angegeben
Flor1an ist offline   Mit Zitat antworten
Alt 20.02.2005, 14:10  
axo
Erfahrener Benutzer
 
Registriert seit: 24.12.2004
Beiträge: 1.814
axo ist zur Zeit noch ein unbeschriebenes Blatt
Standard

Zitat:
Zitat von mbscholz
Zitat:
Zitat von axo
warum produzierst du einen primärschlüssel über zwei spalten?
Weil diese Tabelle relational mit einer Tabelle namens sendung verbunden ist, deren PK ist Sid. In sendung stehen Sachen wie Name, Beschreibung etc. zur Sendung, in sendung_termin werden die einzelnen Sendetermine gespeichert.
genau: primary key für diese tabelle ist also ('Lnr'), und wenn du eine 1-zu-1-fremdschlüssel-assoziation machen willst, komt noch UNIQUE ('Sid','Lnr') als mysql-pseudo-constraint dazu.
man muss nicht alles aus büchern übernehmen, nur weil's dort so steht....
axo ist offline   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
select anfrage php pear, insufficient data supplied createconstraint, pear mysql insufficient data supplied, mysql insufficient data supplied, sendung select sql queries

Alle Zeitangaben in WEZ +2. Es ist jetzt 20:20 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum

Creative Commons License
Dieser Inhalt ist unter einer Creative Commons-Lizenz lizenziert.