Les Objets de Service de Données (Service Data Objects
(SDOs)) permet les applications PHP de travailler
avec des données provenant de différentes sources (comme une requête de
base de données, un fichier XML et une feuille de tableau) en utilisant
une simple interface.
Chaque différente sorte de source de données requiert un Service d'Accès
de Données (Data Access Service (DAS)) pour fournir
un accès aux données dans la source de données.
Dans votre application PHP, vous utilisez un DAS pour créer une instance
SDO qui représente des données dans la source de données. Vous pouvez
alors fixer et récupérer des valeurs dans l'instance SDO en utilisant
l'interface SDO standard. Finalement, vous pouvez utiliser un DAS pour
écrire les données modifiées à une source de données (normalement la
même).
Une instance d'Objet de Service de Données est fait d'un arbre d'objets
de données. L'arbre est défini par des relations contenues entre les
objets de données. Par exemple, une objet de données Compagnie peut
consister en un nombre d'objets de données Département et donc la
Compagnie devrait avoir une relation contenue avec les Départements.
Un SDO peut aussi avoir des références non contenues entre les objets de
données dans l'arbre. Par exemple, un objet de données Employé peut faire
référence à un autre Employé pour identifier son mentor.
Les données peuvent se référencer entre eux, mais peuvent aussi avoir des
propriétés primitives. Par exemple, l'objet de données Compagnie pourrait
avoir une propriété appelée "nom" de type chaîne de caractères pour contenir le nom
de la compagnie (par exemple, "Acme").
Chacune de ces propriétés de l'objet de données - références contenues, références
non-contenues ou propriétés primitives - peut avoir plusieurs valeurs ou une seule.
Dans l'exemple ci-dessous, "Departements" a plusieurs valeurs alors que le nom de
la compagnie n'en a qu'une.
En PHP, chaque objet de données SDO est représenté en tant qu'objet PHP.
Les propriétés de l'objet de données peuvent être accédées en utilisant soit la synthaxe orientée
objet, soit la synthaxe de tableaux associatifs. Nous verrons quelques exemples de
cela plus tard dans la documentation.
L'extension SDO requiert PHP 5.1 ou supérieur. Elle nécessite également la bibliothèque
libxml2. Normalement, libxml2 devrait être déjà installée mais si ce n'est pas le cas, vous
pouvez la télécharger depuis http://www.xmlsoft.org/.
Vous pouvez télécharger et installer la dernière version stable des trois composants SDO
- le core SDO, le XML DAS et le relationnel DAS - avec la commande :
pecl install sdo
Cette commande va construire les bibliothèques partagées SDO et XML mais
va aussi installer les fichiers PHP permettant le relationnel DAS.
Si vous voulez installer la dernière version béta, exécutez plutôt la commande :
pecl install sdo-beta
La commande pecl installe automatiquement les modules
SDO et SDO_DAS_XML dans votre dossier d'extensions PHP. Pour activer les extensions SDO,
vous devez ajouter les lignes suivantes à votre php.ini :
extension=sdo.so
extension=sdo_das_xml.so
Pour plus d'informations sur la constructions de paquets PEAR, consultez la section
de la documentation sur l'installation PECL.
Windows
Les dernières bibliothèques DLLs pour le code SDO et le XML DAS peuvent
être téléchargées respectivement depuis
php_sdo.dll et
php_sdo_das_xml.dll.
Notez qu'actuellement, le site pecl4win
ne fournit pas ces binaires pour le niveau de version courante ; vous ne pouvez
télécharger que le dernier niveau.
La commande pecl installe automatiquement les modules SDO
et SDO_XML_DAS dans votre dossier d'extensions PHP. Pour activer les extensions SDO, vous
devez ajouter les lignes suivantes à votre php.ini :
Le relationnel DAS peut être téléchargé et installé avec la commande :
pecl install -B sdo
Le relationnel DAS est écrit en PHP. Vous devez mettre à jour votre
include_path dans votre php.ini
pour pointer vers le dossier contenant
sdo/DAS/Relational.
Construire SDO sur Linux
Cette section décrit comment construire le noyau SDO et le XML DAS sur
Linux. Vous devriez avoir besoin seulement de savoir
comment faire cela seulement si vous souhaitez construire une version
récente que vous auriez téléchargée de CVS.
Changez le dossier principal d'extension :
cd < où se trouve le code sdo >
Exécutez phpize, qui fixera l'environnement pour
compiler le SDO et le Service de d'Accès de Données XML.
Ensuite, exécutez ./configure; make; make install.
Veuillez noter, vous devriez avoir besoin de vous identifier en tant que
root pour installer cette extension.
Vérifiez que ces modules sont chargés par PHP, en ajoutant
extension=sdo.so et
extension=sdo_das_xml.so
dans votre fichier php.ini dans cet ordre.
Un Service d'Accès de Données basé sur PDO supportant la
lecture/écriture SDO aux bases de données relationnelles.
Implémente une politique optimiste de mises à jour concourante.
La liste suivante contient les limitations dans l'implémentation
courante de SDO :
Il n'y a pas de support pour le jeu de caractère multi-byte.
Ceci doit être considéré, dépendemment de la nécessité de la communauté,
dans la version de PHP où le support de l'Unicode est activé.
Voir les fonctions Unicode.
Limitations SDO
Les concepts suivants de SDO 2.0 ne sont pas supportés dans
l'implémentation courante de PHP.
Ce n'est pas nécessairement le cas que ceux-ci seront ajoutés avec le
temps. Leur inclusion dépendra des besoins de la communauté.
Relations bidirectionnelles.
Type et propriété alias noms.
Propriétés en lecture seule.
Les classes d'aide définies dans SDO 2.0 ne sont pas directement implémentées.
Cependant, une fonction équivalente est fournie dans un style plus naturel
pour PHP. Par exemple, la fonction CopyHelper::copy()
est fournie en utilisant le mot clé clone
de PHP pour un objet de données.
Les exemples ci-dessous assument qu'un SDO est créé avec le schéma et
l'information de l'instance montrée ci-dessous, en utilisant le Service
d'Accès de Données.
L'instance du document ci-dessous décrit un compagnie simple,
nommée 'MegaCorp', qui contient un seul département, nommé
'Advanced Technologies'. Ce département contient trois employés.
La compagnie 'employeeOfTheMonth' référence le second employé,
'Jane Doe'.
L'élément racine de ce schéma est une compagnie. La compagnie contient des départements,
et chaque département contient des employés. Chaque élément a un nombre d'attributs pour y
stocker des valeurs comme le nom, un numéro de série et ainsi de suite. Finalement, la compagnie
a également un attribut IDREF qui identifie un des employés comme 'employeeOfTheMonth'.
Un Service d'Accès de Données XML voit ce schéma comme un SDO. Les attributs
comme "name" deviennent des propriétés primaires, les séquences d'employés
deviennent une relation de contenu à multiples valeurs, et ainsi de suite.
Notez que les relations de contenu sont représentées comme un type complexe
contenu dans un autre, où les références non-contenues sont représentées
en terme d'ID et d'IDREF, avec un attribut sdoxml:propertyType
spécial spécifiant le type de la référence non-contenue.
Les exemples suivants présument que $compagnie
est la racine d'un arbre d'objets de données créés depuis le schéma et le document
montré ci-dessus.
Exemple 1. Accès via les noms de Propriété
Les propriétés des objets de données peuvent être accéder en utilisant
la syntaxe d'accès de propriété d'objet. L'exemple fixe le nom de
compagnie à 'Acme'.
<?php $compagnie->nom = 'Acme'; ?>
Exemple 2. Accès via le nom de la propriété en tant que tableau indexé
Nous pouvons également accéder aux propriétés en utilisant lun tableau associatif.
La forme la plus simple est d'utiliser le nom de la propriété dans le tableau indexé.
Par exemple, ce qui suit définit le nom de la compagnie et récupère l'"employeeOfTheMonth".
The 'manager' property is not output, because it has not been set.
Exemple 4. Accès à une propriété à valeurs multiples par le nom
Les propriétés à valeurs multiples d'un objet de données peuvent être
accédées en utilisant la synthaxe des noms de propriétés de l'objet.
Ce qui suit récupère la liste des départements.
<?php $departments = $company->departments; ?>
Exemple 5. Accès aux éléments à valeurs multiples
Nous pouvons accéder aux éléments individuels des propriétés à valeurs
multiples en utilisant la synthaxe des tableaux. Ce qui suit permet d'accéder
au premier département de la compagnie.
Dans tous les cas, la variable dept_name est définie à 'Emerging Technologies'.
Exemple 8. Navigation XPath
Le tableau associatif indexé peut être une expression façon XPath.
Les expressions valides sont définies par une sous définission d'XPath.
Deux façons d'indexations de propriétés à valeurs multiples sont supportées.
La remière est la synthaxe de tableau XPath standard dont l'index commence
à 0, la seconde est une extension SDO à XPath avec un index qui commence
à 0. La synthaxe standard est :
Both these examples get the second employee from the first department.
Exemple 9. Requête XPath
Nous pouvons utiliser XPath pour effectuer une requête et ainsi identifier
des parties d'un objet de données basé sur des données instanciées.
Ce qui suit récupère le manager depuis le département
'Advanced Technologies'.
Un objet de données peut être une fraction pour ces objets de données fils.
Un objet de données fils est automatiquement une partie des données.
Ce qui suit ajoute un nouvel employé au département
'Advanced Technologies'.
Nous pouvons utiliser la fonction isset() et
unset() pour tester et effacer des éléments
de l'objet de données.
Ce qui suit efface le nom du premier département.
<?php unset($company->departments[0]->name); ?>
Exemple 12. Effacement d'un objet de données
La fonction unset() peut également être utilisée
pour effacer un objet de données de l'arbre.
L'exemple suivant montre comment John Jones à quitter la compagnie...
Exemple 13. Effacement d'un objet de données référencé
Ce qui suit efface 'employeeOfTheMonth' de la compagnie.
Si c'est une relation contenue, alors l'employé sera effacé de la compagnie.
(probablement pas une bonne idée que d'effacer chaque mois votre meilleur employé !)
mais si c'est une relation non-contenue, l'employé référencé restera
dans le département de la compagnie, mais ne sera plus accessible
via la propriété 'employeeOfTheMonth'.
<?php if (isset($company->employeeOfTheMonth)) { unset($company->employeeOfTheMonth); } ?>
Exemple 14. Accès via l'index de la propriété
Les propriétés de l'objet de données peuvent être accédées via leurs index en utilisant
la synthaxe de tableaux. L'index de la propriété est la position dont la propriété
apparait dans le modèle (dans ce cas, le schéma XML). Nous pouvons voir
dans le schéma listé ci-dessus que l'attribut du nom de la compagnie
est la seconde propriété de la compagnie (l'interface SDO ne fait pas de distinction
entre les attributs XML et les éléments). Ce qui suit va définir le nom de la compagnie
en 'Acme', avec le même résultat que lors de
l'accès via le nom de la propriété.
<?php $company[1] = 'Acme'; ?>
L'utilisation directe de l'index dans ce cas est fragile. Normalement, la synthaxe
reposant sur le nom de la propriété est préférable, mais l'index des propriétés
peut être nécessaire dans des cas très spéciaux.
Des objets de données en Séquence sont des SDOs peuvent tracer l'ordre des
propriétés à travers les propriétés des objets de données. Ils peuvent
aussi contenir des éléments de texte non structuré (element de texte qui
n'appartient à aucune des propriétés SDO). Des objets de données en Séquence
sont utiles pour travailler avec des documents XML qui permettent du texte
non structuré (c'est-Ã -dire mixed=true) ou si les éléments peuvent être
intercalée (<A/><B/><A/>). Ceci peut se produire par exemple
lorsque le schéma définit maxOccurs>1 sur un élément qui est un
complexType avec un choix de l'ordre.
Les exemples ci-dessous assument qu'un SDO est créé avec le schéma et
l'information de l'instance montrée ci-dessous, en utilisant le Service
d'Accès de Données.
Le schéma ci-dessous décrit le format d'une lettre. La lettre peut
optionnellement contenir trois propriétés; date, prenom et nomFamille. Le
schéma indique mixed="true" qui signifie que le texte
non structuré peut être entremêlé entre les trois propriétés.
L'exemple suivant est une instance du document lettre. Il contient les
trois propriétés de la lettre; date, prenom et nomFamille, et a des
éléments de texte non structuré pour l'adresse et le corps de la lettre.
<lettre:lettres xmlns:lettre="http://lettreSchema">
<date>1er Mars 2005</date>
Mutual of Omaha
Wild Kingdom, USA
Chère
<prenom>Casy</prenom>
<nomFamille>Crocodile</nomFamille>
S'il vous plaît, achetez plus de requin imperméable.
Votre prime est passée date.
</lettre:lettres>
Lorsque chargé, l'objet de données de lettre aura la séquence et les
indices montrés dans la table ci-dessous :
Index de Séquence
Index:Nom
Valeur
0
0:date
1er Mars 2005
1
-
Mutual of Omaha
2
-
Wild Kingdom, USA
3
-
Chère
4
1:prenom
Casy
5
2:nomFamille
Crocodile
6
-
S'il vous plaît, achetez plus de requin imperméable.
7
-
Votre prime est passée date.
Pour s'assurer que la séquence des indices soit maintenue, les objets de
données en séquence devraient être manipulés à travers de l'interface
SDO_Sequence. Ceci permet à l'instance de l'objet de données à être
manipulée en tant qu'index de séquence plutôt qu'avec un index de propriété
(montré dans la table ci-dessus).
Les exemples suivants assument que l'instance de la lettre a été chargée
dans l'objet de données référencé par la variable
$lettre.
Exemple 15. Récupération de l'interface SDO_Sequence
Nous obtenons la séquence de l'objet de données en utilisant la méthode
getSequence(). La suite récupère la séquence pour
l'objet de données de la lettre.
<?php $lettre_seq = $lettre->getSequence(); ?>
Tous les exemples suivants assument que la variable
$lettre_seq a été assigné de la séquence pour l'objet
de données de la lettre.
Exemple 16. Récupère/Fixe des valeurs de séquence
Nous pouvons récupérer et fixer des valeurs individuelles (en incluant
le texte non structuré) en utilisant les index de séquence. L'exemple
suivant fixe le prenom à 'Snappy' et récupère la dernière valeur de
séquence (le texte non structuré, 'Votre prime est passée date.').
Nous pouvons itérer à travers des valeurs de séquence individuellement
en utilisant foreach. L'exemple suivant passe au travers des valeurs
individuelles dans l'ordre séquentiel.
<?php foreach ($lettre->getSequence() as $valeur) { // ... } ?>
Exemple 18. Séquence versus Objet de Données
Fixer des valeurs à travers l'interface d'objet de données peut amener Ã
ce que les valeurs ne fassent pas partie de la séquence. Une valeur
fixée avec un objet de données sera seulement accessible avec la
séquence si la propriété était déjà une partie de la séquence. L'exemple
suivant fixe le nomFamille à travers de l'objet de données et le
récupère par la séquence. Ceci est correct puisque nomFamille existe
déjà dans la séquence. S'il n'avait pas été fixé, alors nomFamille
devrait être fixé Ã 'Smith', mais ne devrait pas faire partie de la
séquence.
Nous pouvons ajouter de nouvelles valeurs à une séquence en utilisant la
méthode
SDO_Sequence::insert().
Les exemples suivants assument que les propriétés 'prenom' et
'nomFamille' sont non fixées.
<?php // Ajoute une valeur prenom à la séquence // valeur : 'Smith' // index séquence : NULL (ajout) // identifiant de propriété : 1 (index propriété prenom) $lettre_seq->insert('Smith', NULL, 1);
// Ajoute une valeur nomFamille à la séquence // valeur : 'Jones' // index séquence : NULL (ajout) // identifiant de propriété : 'nomFamille' (nom propriété nomFamille) $lettre_seq->insert('Jones', NULL, 'nomFamille');
// Ajoute du texte non structuré // valeur : 'Annule Inscription.' // index séquence : absent (ajout) // identifiant de propriété : absent (texte non structuré) $lettre_seq->insert('Annule Inscription.');
// Ajoute du nouveau texte non structuré. Les séquence valeurs suivantes // d'ordre sont décalées vers le haut // valeur : 'À l'attention de :' // index séquence : 1 (insert comme second élément) // identifiant de propriété : absent (texte non structuré) $lettre_seq->insert('À l'attention de :', 1); ?>
Exemple 20. Suppression d'une séquence
Nous pouvons utiliser les fonctions isset() et
unset() pour tester et supprimer des items de la
séquence (Note : unset() laisse actuellement les
valeurs dans l'objet de données, mais ce comportement est devrait
changer et supprimer les données de l'objet de données).
Une séquence se comporte comme une liste contiguë; donc, la suppression
d'un item au milieu de la liste décalera les entrées d'un indice plus
haut vers le bas. L'exemple suivant teste pour vérifier si la première
séquence d'élément est fixé et la détruit si elle l'est.
<?php if (isset($lettre_seq[0])) { unset($lettre_seq[0]); } ?>
Les SDOs ont une connaissance de la structure qu'ils ont créée pour la
représentation (le modèle). Par exemple, une Compagnie SDO créée utilisant
le schéma de Compagnie XML ci-dessus
devrait seulement être permis de contenir des objets de données
DepartementType qui à leur tour devrait contenir seulement des objets de
données EmployeType.
Parfois, il est utile d'être capable d'accéder ces informations de modèle Ã
l'exécution. Par exemple, cela pourrait être utilisé pour générer
automatiquement une interface d'usager pour remplir un objet de données.
Les informations de modèle sont accédées en utilisant la réflexion.
Exemple 21. Réflexion sur les Objets de Données
L'exemple suivant montre comment nous pouvons utiliser la réflexion sur
un objet de données vide Employe.
<?php // Crée l'objet de données employe (par exemple, Ã partir de Service d'Accès // de données XML) $employe = ...; $reflexion = new SDO_Model_ReflectionDataObject($employe); print($reflexion); ?>
L'utilisation de print sur SDO_Model_ReflectionDataObject écrit Ã
l'écran les données du modèle de l'objet. Nous pouvons voir à la sortie
que le type compagnieNS:EmployeType a trois propriétés et nous pouvons
voir le noms de ces propriétés avec leur type. Notez, les types
primitifs sont listés en tant que types SDO (par exemple, commonj.sdo
namespace, String type). Cela vaut la peine de noter que c'est le modèle
SDO et lorsqu'ils sont utilisés dans l'application, ils peuvent être
traités comme des types équivalent PHP (par exemple, chaîne de caractères et
booléen).
Exemple 22. Accès d'informations de type
Nous pouvons effectuer une requête de type d'informations sur un objet
de données en utilisant la réflexion. L'exemple suivant vérifie que le
type corresponde à l'objet de données plutôt qu'à une primitive et alors
itère à travers des propriétés de type, en affichant le nom de chaque
propriété ($type et $property sont respectivement des objets
SDO_Model_Type et SDO_Model_Property).
<?php // Crée l'objet de données employe (par exemple, Ã partir de Service d'Accès // de données XML) $employe = ...; $reflexion = new SDO_Model_ReflectionDataObject($employe); $type = $reflexion->getType(); if (! $type->isDataType()) { foreach ($type->getProperties() as $property) { print $property->getName() . "\n"; } } ?>
SDO consiste en trois blocs d'interface. Le premier bloc couvre les
interfaces pour utiliser avec les applications typiques SDO. Celles-ci
sont identifiées par le préfixe de package 'SDO_'. Le deuxième bloc est
celui qui utilise les interfaces qui sont utilisées pour la réflexion, et
travaille avec le modèle d'objet de données. Ces interfaces sont
identifiées par le préfixe de package 'SDO_Model_'. Finalement, le
troisième bloc est celui qui utilise les interfaces qui sont utilisées par
les implémentations de Service d'Accès de Données et sont identifiées par
le préfixe de package 'SDO_DAS_'. La majorité des utilisateurs SDO
n'auront pas besoin d'utiliser ou de comprendre les interfaces
'SDO_Model_' et 'SDO_DAS_'.
L'interface principale dans laquelle les objets de données sont
manipulés. En plus des méthode ci-dessous, SDO_DataObjet étend les
interfaces ArrayAccess, SDO_PropertyAccess (définit les méthodes
__get() / __set() pour surcharger
l'accès aux propriétés), Iterator et Countable.
L'interface dans lequel les objets de données en séquence peuvent être
accédés pour préserver l'ordre parmi les propriétés de l'objet de
données et pour permettre le texte non structuré.
SDO_Sequence préserve les indices contigus et donc l'insertion ou la
suppression d'éléments peut entraîner un décalage des autres éléments
vers le haut ou vers le bas. En plus des méthodes ci-dessous,
SDO_Sequence étend les interfaces ArrayAccess, Interator et Countable.
L'interface dans lequel les propriétés de plusieurs valeurs sont
manipulées. En plus des méthodes définies ci-dessous, SDO_List étend
ArrayAcces, Iterator et Countable. SDO_List préserve les indices
contigus et donc l'insertion ou la suppression des éléments peut décaler
les autres éléments vers le haut ou vers le bas.
L'interface dans lequel les objets de données peuvent être créés.
Un Service d'Accès de Données est responsable de remplir le modèle
(c'est-Ã -dire, la configuration des classe de données avec le type et
les informations de structure pour les objets de données qu'elle peut
créer.) pour les classes et peut alors optionnellement retourner une
instance ou une implémentation de l'interface de SDO_DataFactory.
Une exception SDO_Exception est lancée lorsque la demande de l'appelant ne peut
être honorée. Les sous classes de SDO_Exception sont :
SDO_PropertyNotSetException -
la propriété spécifiée existe mais n'a pas été définie ou n'a pas de valeur
par défaut
SDO_PropertyNotFoundException -
la propriété spécifiée ne fait pas partie du type de l'objet de données
SDO_TypeNotFoundException -
l'URI d'espace de noms spécifiée ou le nom du type est inconnu
SDO_InvalidConversionException -
la conversion entre les types d'assignement n'est pas possible
SDO_IndexOutOfBoundsException -
l'index numérique d'un objet de données, d'une séquence ou d'une liste
n'est pas dans un intervalle valide
SDO_UnsupportedOperationException -
la demande n'a pû être honorée car elle n'est pas autorisée,
par exemple, une tentative de définition d'une propriété en lecture seule
L'interface principale est utilisée pour la réflexion d'une instance
d'objet de données pour obtenir son type de modèle et les informations
de propriété. Elle est désignée pour suivre le motif de réflexion
introduit dans PHP 5.
L'interface dans lequel les informations de type de l'objet de données
peuvent être récupérées. Cette interface peut être utilisée pour trouver
le nom de type et l'espace de nom URI du type, si le type autorise
l'ouverture du contenu, et ainsi de suite.
L'interface dans lequel les informations de propriété d'objet peuvent
être récupérées. Cette interface peut être utilisée pour trouver le type
d'une propriété, si une propriété a une valeur par défaut, si une
propriété est contenue ou référencée par son parent, sa cardinalité, et
ainsi de suite.
L'interface dans lequel un Service d'Accès de Données peut accéder Ã
SDO_DAS_ChangeSummary de
l'objet de données. Le résumé de changement est utilisé par le Service
d'Accès de Données pour vérifier les conflits lors des applications des
changements à une source de données.
L'interface dans lequel l'historique de changement d'un objet de données
est accédé. Le résumé de changement contient des informations pour
n'importe quelles modifications sur un objet de données qui s'est
produites lorsque la journalisation a débuté. Dans le cas de suppression
ou de modification, les dernières valeurs sont aussi gardées dans le
résumé de changement.
Si la journalisation n'est plus active, alors le résumé de changement
contient seulement les changements faits jusqu'au point où la
journalisation fut désactivée. La réactivation de la journalisation
supprime le résumé de changement. Cela peut être utile lorsqu'un
certain nombre de changements ont été écris par un DAS et un objet de
données qui est réutilisé.
L'interface dans lequel l'ancienne valeur pour une propriété est
accédée. Une liste des configurations est retournée par le résumé de
changement dont la méthode est
getOldValues().
L'interface pour construire le modèle pour un SDO_DataObjet. Le
SDO_DAS_DataFactory est une classe abstraite fournissant une méthode
statique qui retourne une classe d'implémentation de données concrète.
L'implémentation est utilisée par les Services d'Accès de Données pour
créer un modèle SDO Ã partir de leur modèle.
Par exemple, un Service d'Accès de Données Relationnel peut créer et
remplir un modèle SDO_DAS_DataFactory basé sur un schéma pour une base
de données relationnelle.
Ces constantes sont définies par cette
extension, et ne sont disponibles que si cette extension a été compilée avec
PHP, ou bien chargée au moment de l'exécution.
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: Access denied for user 'www-data'@'localhost' (using password: NO) in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355
Warning: mysql_real_escape_string() [function.mysql-real-escape-string]: A link to the server could not be established in /home/stefvar.com/public_html/modules/Multiheadlines/functions.php on line 355