kostenloser Webspace werbefrei: lima-city


Von mysql_* zu PDO

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    webfreclan

    Kostenloser Webspace von webfreclan

    webfreclan hat kostenlosen Webspace.

    Hallo,

    ich versuche gerade meine Projekte von den mysql_* - Befehlen auf PDO (PHP Data Objects) umzustellen, allerdings gibt es bei mir dabei Probleme: ich habe jetzt eine Datei von mysql_* auf PDO umgestellt und es funktioniert nicht.

    Hier der Code:
    $dbc = new PDO(''.$DBTYPE.':host='.$HOST.';dbname='.$DB.';charset='.$CHARSET.'', $USER, $PW);  
       $import = file_get_contents("wcms.sql");
       $import = preg_replace ("%/\*(.*)\*/%Us", '', $import);
       $import = preg_replace ("%^--(.*)\n%mU", '', $import);
       $import = preg_replace ("%^$\n%mU", '', $import);
       $import = str_replace('$PREFIX', $PREFIX, $import);
       $import = $dbc->quote($import);
       $import = explode (";", $import); 
       foreach ($import as $imp){
        if ($imp != '' && $imp != ' '){
         $dbc->query($imp);
        }
       }  
    $url12 = $_SERVER['SERVER_NAME'];
    $dbc->query("INSERT INTO ".$PREFIX."_data (id, name, url, text, date, active) VALUES ('8', 'url', '".$url12."', 'none', now(), '0')");
    $dbc->query("INSERT INTO ".$PREFIX."_data (id, name, url, text, date, active) VALUES ('29', 'version', 'none', '0.4', now(), '0')");
    $dbc->query("INSERT INTO ".$PREFIX."_data (name, url, text, date, active) VALUES ('senddata', 'none', '".$_SESSION['senddata']."', now(), '0')");
    header("Location: ?install=4");


    Mit dem mysql_* - Befehlen ging der Teil der Datei noch, jetzt nicht mehr, also muss es an PDO liegen, PDO + die MySQL - Treiber sind auf meinem Server installiert.

    Ich hoffe, hier gibt es jemanden, der sich mit PDO auskennt ...
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Wofür hast du denn den Aufruf von PDO::quote mit drin? Das eskaped dir ja theoretisch die komplette Abfrage.
    Was bekommst du denn für eine Fehlermeldung? Tun die anderen Statesments unten?

    Wobei hier PDO eh wenig Sinn macht, wenn du eh nur 1 Datenbanksystem nutzt und dazu noch nicht einmal prepared Statements. Da kannst du auch gleich mysqli nutzen, da hast du - bei bedarf - auch noch die "alte" Schreibweise "mysqli_query", etc.
  4. //...
    $import = $dbc->quote($import);
    $import = explode(';', $import);
    //...


    Ein PDOStatement Objekt lässt sich schlecht exploden. http://php.net/manual/de/class.pdostatement.php

    Außerdem mehrfach vergabe der selben variable mit völlig unterschiedlichen Typen ist nicht wirklich das Gelbe vom Ei.

    <?php
    
    $dbh = new PDO('...');
    $sql = file_get_contens('...');
    
    // Filtering ->
    $sql = preg_replace('...');
    //...
    
    $stm = $dbh->query($sql);
    $res = $stm->fetchAll();
    foreach($res as $var) {
      //...
    }


    Das aber nur als kleines Beispiel. Wie aber auch schon erwähnt worden ist, macht PDO nur wirklich Sinn wenn du Prepared Statements benutzt und unbedingt perma-connect haben willst.


    Bei Bedarf hier mal meine kleiner sqlHelper Trait:
    <?php
    
    /**
     * SQLHelper.
     *
     * @category Traits
     * @version v0.0.1a
     *
     * @author Daniel Lieberwirth <daniellieberwirth@gmail.com>
     *
     * @copyright (c) 2014, beStrange Media
     * @license http://www.gnu.org/licenses/ GPL3
     */
    trait SQLHelper {
    
    	/**
    	 * Generates everything needed for an Select-Query.
    	 * @param string $table Table-Name
    	 * @param mixed $select <b>String:</b> Selection (default = *)<br>
    	 *						<b>Array:</b> Selections as value
    	 * @param array $params [optional] Param-Array ('DB-Field' => 'Value')
    	 * @param bool $prepared <b>True:</b> Method returns an array containing all elements needed
    	 *									  for a prepared statement<br>
    	 *						 <b>False:</b> Methods return just the Query-String for direct
    	 *									   use with a query
    	 * @return mixed <b>String:</b> SQL-String, if $prepared is false<br>
    	 *				 <b>Array:</b> Containing the SQL-String and the Params-Array
    	 * @throws \InvalidArgumentException
    	 */
    	final protected static function sqlSelect($table, $select = '*', array $params = null, $prepared = true) {
    		if(!is_string($table))
    			throw new \InvalidArgumentException('Argument #1 is not a string.');
    		if(!is_string($select) and !is_array($select))
    			throw new \InvalidArgumentException('Argument #2 is not a string or an array.');
    		if(!is_bool($prepared))
    			throw new \InvalidArgumentException('Argument #4 is not a boolean.');
    		if(is_array($select)) {
    			foreach($select as $k => $v)
    				$select[$k] = '`'.$v.'`';
    			$select = implode(' ', $select);
    		}
    		if(isset($params)) {
    			if(!$prepared) {
    				foreach($params as $k => $v)
    					$s[] = '`'.$k.'` = '.$v;
    				return 'SELECT '.$select.' FROM `'.$table.'` WHERE '.implode(' AND ', $s);
    			}
    			foreach($params as $k => $v) {
    				$s[] = '`'.$k.'` = :'.strtolower($k);
    				$p[':'.strtolower($k)] = $v;
    			}
    			return array(
    				'sql' => 'SELECT '.$select.' FROM `'.$table.'` WHERE '.implode(' AND ', $s),
    				'params' => $p
    			);
    		}
    		return 'SELECT '.$select.' FROM `'.$table.'`';
    	}
    
    	/**
    	 * Generates everything needed for an Insert-Query.
    	 * @param string $table Table-Name
    	 * @param array $params Param-Array ('DB-Field' => 'Value')
    	 * @param bool $prepared <b>True:</b> Method returns an array containg all elements needed
    	 *									  for a prepared statement<br>
    	 *						 <b>False:</b> Method returns just the Query-String for direct
    	 *									   use with a query
    	 * @return mixed <b>String:</b> SQL String, if $prepared is false<br>
    	 *				 <b>Array:</b> Containing the SQL-String and the Params-Array
    	 * @throws \InvalidArgumentException
    	 */
    	final protected static function sqlInsert($table, array $params, $prepared = true) {
    		if(!is_string($table))
    			throw new \InvalidArgumentException('Argument #1 is not a string.');
    		if(!is_bool($prepared))
    			throw new \InvalidArgumentException('Argument #3 is not a boolean.');
    		if(!$prepared) {
    			foreach($params as $k => $v) {
    				$sk[] = '`'.$k.'`';
    				$sV[] = $v;
    			}
    			return 'INSERT INTO `'.$table.'` ('.implode(', ', $sk).') VALUES ('.implode(', ', $sV).')';
    		}
    		foreach($params as $k => $v) {
    			$sK[] = '`'.$k.'`';
    			$sV[] = ':'.strtolower($k);
    			$p[':'.strtolower($k)] = $v;
    		}
    		return array(
    			'sql' => 'INSERT INTO `'.$table.'` ('.implode(', ', $sK).') '.
    					 'VALUES ('.implode(', ', $sV).')',
    			'params' => $p
    		);
    	}
    
    	/**
    	 * Generates everything needed for an Update-Query.
    	 * @param string $table Table-Name
    	 * @param array $params Param-Array ('DB-Field' => 'Value')
    	 * @param string $key Keyname for the Update-Target
    	 * @param bool $prepared <b>True:</b> Method returns an array containg all elements needed
    	 *									  for a prepared statement<br>
    	 *						 <b>False</b> Method returns just the Query-String for direct
    	 *									  use with a query
    	 * @return mixed <b>String:</b> SQL String, if $prepared is false<br>
    	 *				 <b>Array:</b> Containing the SQL-String and the Params-Array
    	 * @throws \InvalidArgumentException
    	 * @throws \OutOfBoundsException
    	 */
    	final protected static function sqlUpdate($table, array $params, $key, $prepared = true) {
    		if(!is_string($table))
    			throw new \InvalidArgumentException('Argument #1 is not a string.');
    		if(!is_string($key))
    			throw new \InvalidArgumentException('Argument #3 is not a string.');
    		if(!is_bool($prepared))
    			throw new \InvalidArgumentException('Argument #4 is not a boolean.');
    		if(!isset($params[$key]))
    			throw new \OutOfBoundsException('"'.$key.'" not found in params.');
    		$t = is_string($params[$key]) ? 'LIKE' : 'WHERE';
    		if($prepared === false) {
    			foreach($params as $k => $v)
    				$s[$k] = '`'.$k.'` = '.$v;
    			unset($s[$key]);
    			return 'UPDATE `'.$table.'` SET '.imlode(', ', $s).' '.$t.' `'.$key.'` = '.$params[$key];
    		}
    		foreach($params as $k => $v) {
    			$s[$k] = '`'.$k.'` = :'.strtolower($k);
    			$p[':'.strtolower($k)] = $v;
    		}
    		unset($s[$key]);
    		return array(
    			'sql' => 'UPDATE `'.$table.'` SET '.implode(', ', $s).' '.$t.' `'.$key.'` = :'.strtolower($key),
    			'params' => $p
    		);
    	}
    
    	/**
    	 * Gnerates a DateTime string from an DateTime object.
    	 * @param \DateTime $date Subject
    	 * @return string SQL compatible DateTime string
    	 */
    	final protected static function sqlDateTimeEncode(\DateTime $date) {
    		return $date->format(\DateTime::ISO8601);
    	}
    
    	/**
    	 * Creates a DateTime object from a DateTime string.
    	 * @param string $date 'Y-n-j H:i:s' DateTime string
    	 * @return \DateTime
    	 * @throws \InvalidArgumentException
    	 */
    	final protected static function sqlDateTimeDecode($date) {
    		if(!is_string($date))
    			throw new \InvalidArgumentException('Argument is not a string.');
    		return \DateTime::createFromFormat('Y-n-j H:i:s', $date);
    	}
    
    }

    Ich übernehme keine Garantie!
  5. Autor dieses Themas

    webfreclan

    Kostenloser Webspace von webfreclan

    webfreclan hat kostenlosen Webspace.

    muellerlukas schrieb:
    wenn du eh nur 1 Datenbanksystem nutzt

    Mache ich aber nicht (ich will MySQL und SQLite verwenden), deshalb nutze ich ja jetzt PDO.
    strange schrieb:
    Ein PDOStatement Objekt lässt sich schlecht exploden. http://php.net/manual/de/class.pdostatement.php

    Außerdem mehrfach vergabe der selben variable mit völlig unterschiedlichen Typen ist nicht wirklich das Gelbe vom Ei.

    Danke, jetzt funktioniert es.
  6. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!