Lieber j4nk3y,
Für PDO könnte ich Dir eine klitzekleine Klasse anbieten, die Dir im Hintergrund etwas vereinfacht,[...] Woher kommen die funktion
get()
bzw.send()
[aus deiner Antwort], ich finde diese nicht im Manual?
natürlich nicht, die gehören ja zu meiner Klasse, die auf PDO aufbaut. Hier für Dich meine Datenbank-Klasse:
<?php
/**
* database handling
*/
class MyPDO {
/**
* error messages
*
* @var array
*/
public $errors;
/**
* PDO instance
*
* @var object PDO instance
*/
private $pdo;
/**
* constructor
*
* This function needs an array with these keys:
* $settings = array(
* 'db-host' => (string),
* 'db-name' => (string),
* 'db-user' => (string),
* 'db-pw' => (string)
* )
*
* @param array
*/
public function __construct ($settings) {
$t = $this;
$t->errors = array();
try {
$t->pdo = new PDO(
sprintf(
'mysql:dbname=%1$s;host=%2$s;charset=UTF8;',
$settings['db-name'],
$settings['db-host']
),
$settings['db-user'],
$settings['db-pw'],
array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::MYSQL_ATTR_FOUND_ROWS => true,
PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
)
);
} catch (PDOException $e) {
$t->errors[] = $t->get_error($e);
}
}
/**
* wrapper for PDO::prepare, PDOStatement::execute
* and PDOStatement::fetchAll
*
* This function passes the parameters through to the PDO object.
*
* @param string SQL
* @param array parameters list
* @param int column number for PDO::FETCH_COLUMN fetch mode
* @return array result sets
*/
public function get ($sql = '', $params = array(), $col = null) {
$t = $this;
$r = array();
if (empty($sql)) {
return $r;
}
$st = $t->pdo->prepare($sql);
try {
$st->execute($params);
$r = (
!is_null($col) && is_numeric($col)
? $st->fetchAll(PDO::FETCH_COLUMN, $col)
: $st->fetchAll(PDO::FETCH_ASSOC)
);
} catch (PDOException $ex) {
$t->errors[] = $t->get_error(
$ex,
array('sql' => $sql, 'params' => $params)
);
}
return $r;
}
/** function to extract error code information
*
* @param PDOException object
* @param array with SQL query data
*/
private function get_error ($e, $query) {
$error = sprintf(
'DB returned an error:'."\r\n"
. '%1$s'."\r\n"
. 'Query:'."\r\n"
. '%2$s',
$e->getMessage(),
print_r($query, true)
);
return $error;
}
/**
* function to send a query to the DB
*
* This function passes the parameters through to the PDO object.
*
* @param string SQL
* @param array parameters list
* @return int number of affected rows
*/
public function send ($sql = '', $params = array()) {
$t = $this;
if (empty($sql)) {
return;
}
$st = null;
try {
$st = $t->pdo->prepare($sql);
$st->execute($params);
} catch (PDOException $ex) {
$t->errors[] = $t->get_error(
$ex,
array('sql' => $sql, 'params' => $params)
);
}
if (is_object($st) && method_exists($st, 'rowCount')) {
return $st->rowCount();
}
return 0;
}
}
Wenn Du diese Klasse mit require_once
einbindest, dann kannst Du sie so nutzen:
<?php
// DB-Klasse laden
require_once './db-klasse-mit-pdo.php';
// Verbindung zur Datenbank aufbauen
$db = new MyPDO(array(
'db-host' => 'localhost',
'db-name' => 'chat',
'db-user' => 'j4nk3y',
'db-pw' => 'sehrgeheim'
));
// in Datenbank schreiben
$db->send(
// SQL
'INSERT INTO `chatlog` (`message`, `user`) VALUES (:message, :user);',
// Parameter für SQL-Platzhalter
array(
':message' => 'hey j4nk3y wassup?',
':user' => $_SESSION['login']['user']
)
));
// von Datenbank lesen
$array = $db->get(
// SQL
'SELECT * FROM `chatlog` WHERE `user`=:user;',
// Parameter
array(':user' => 'j4nk3y')
);
Liebe Grüße,
Felix Riesterer.