NPDS – Meta Mot X Derniers commentaires

ketzol a demandé il y a quelques jours sur le forum de NPDS, si il existait une fonction permettant d’afficher les X Derniers Commentaires, jusqu’à présent ce n’était pas possible mais aujourd’hui c’est chose faite.

Pour installer ce méta-mot vous avez deux possibilités :

L’installer manuellement en suivant cette méthode, Installation et Gestion des Méta-Mot,
avec le fichier d’installation automatique qui se trouve par ici X derniers commentaires

[fusion_builder_container hundred_percent= »yes » overflow= »visible »][fusion_builder_row][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
function MM_dernierCommentaires($nbCommentaire = 10, $maLimite = 80) {
global $NPDS_Prefix;

$nbCommentaire = arg_filter($nbCommentaire);
$maLimite = arg_filter($maLimite);

$sqlSelect = ‘SELECT ‘.$NPDS_Prefix.’posts.topic_id, ‘.$NPDS_Prefix.’posts.poster_id, ‘.$NPDS_Prefix.’posts.post_text, ‘.$NPDS_Prefix.’users.name, ‘.$NPDS_Prefix.’stories.title
FROM ‘.$NPDS_Prefix.’posts
INNER JOIN ‘.$NPDS_Prefix.’users ON ‘.$NPDS_Prefix.’posts.poster_id = ‘.$NPDS_Prefix.’users.uid
INNER JOIN ‘.$NPDS_Prefix.’stories ON ‘.$NPDS_Prefix.’posts.topic_id = ‘.$NPDS_Prefix.’stories.sid
WHERE forum_id = -1
ORDER BY post_id DESC
LIMIT ‘.$nbCommentaire;
$execSqlSelect = sql_query($sqlSelect);
$content .= ‘<ul id="dernierCommentaire">’;

while($dernierCommentaires = sql_fetch_row($execSqlSelect)) {
$dernierComment = strip_tags($dernierCommentaires[2]);
if(strlen($dernierComment) &amp;gt;= $maLimite) {
while($dernierComment[$maLimite – 1] != " ") {
$maLimite++;
}
$dernierComment = substr($dernierComment, 0, $maLimite);
$dernierComment .= ‘ …’;
}
$remplaceNPDS = str_replace(‘NPDS’, ‘npds’, $dernierCommentaires[4]);
$content .= $dernierCommentaires[1] == 1 ? ‘<li>Anonyme : <a title="’.$remplaceNPDS.’" href="article.php?sid=’.$dernierCommentaires[0].’">’.$dernierComment.'</a></li>’ : ‘<li><a href="user.php?op=userinfo&amp;amp;uname=’.$dernierCommentaires[3].’">’.$dernierCommentaires[3].'</a> : <a title="’.$remplaceNPDS.’" href="article.php?sid=’.$dernierCommentaires[0].’">’.$dernierComment.'</a></li>’;
}
$content .= ‘</ul>’;
return($content);
}

[/php][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

SQLServer – Comment réindexer une base

Le script qui suit est issu de la FAQ du site Developpez

Voici la description faite sur le site par HULK

La gestion des index par SQL Server peut entraîner la fragmentation de ceux-ci et une dégradation des performances. Si le volume d’informations de votre base évolue beaucoup, il est nécessaire de réindexer votre base. Plus votre base change, plus les index perdent en efficacité, il faut donc les recréer. On peut reconstruire les index avec la commande DBCC REINDEX.

Le seul truc pour moi c’est que le script ne prenait pas en compte les schémas, voici donc la modification du script avec la prise en compte des schémas.

[fusion_builder_container hundred_percent= »yes » overflow= »visible »][fusion_builder_row][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][sql]
DECLARE @schemaName sysname
DECLARE @table_name sysname
DECLARE @schemaTable varchar(max)
DECLARE @TSQL nvarchar(4000)
DECLARE @Err int
DECLARE @Mess varchar(400)
SET @Mess = ‘Début réindexation’
RAISERROR(@Mess, 10, 1) WITH LOG
–Modif de la requete Hotfirenet
DECLARE table_list CURSOR FAST_FORWARD FOR SELECT sch.name as schemaName, tab.name as nom FROM sys.tables as tab INNER JOIN sys.schemas as sch ON tab.schema_id = sch.schema_id WHERE type = ‘u’
–Fin de modif
OPEN table_list
FETCH NEXT FROM table_list INTO @schemaName, @table_name
WHILE @@fetch_status = 0
BEGIN
–Modif Hotfirenet
SET @schemaTable = ‘[‘+@schemaName+’].[‘+@table_name+’]’
–Fin de modif
SET @TSQL = N’DBCC DBREINDEX("’ + @schemaTable + N’")’

EXECUTE sp_executesql @TSQL
–SELECT @TSQL
SET @Err = @@error
IF (@Err != 0)
BEGIN
SET @Mess = ‘Echec réindexation table ‘ + @schemaTable + ‘ suite erreur ‘ + CONVERT(varchar, @Err)
RAISERROR(@Mess, 16, 1) WITH LOG
END

FETCH NEXT FROM table_list INTO @schemaName, @table_name
END
CLOSE table_list
DEALLOCATE table_list
SET @Mess = ‘Fin réindexation’
RAISERROR(@Mess, 10, 1) WITH LOG
GO
[/sql][/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

NPDS – Connaitre le nombre de MI par membre

Voici la problématique, Oim m’a demandé un peu d’aide pour un module de gestion de la messagerie interne qu’il réalise pour NPDS.

Cette messagerie est relativement consommatrice en terme de stockage de ces messages interne, surtout lorsque l’on approche les 6000 membres.

Le but de ce script est de savoir donc le nombre de message archivés par le membre, et le nombre de message qu’il a reçu, puis de faire un des messages et de les classer par ordre décroissant.

Ce script utilise des fonctions PHP, tel que: array, arsort, reset, key, next …

Voici le résultat :

[fusion_builder_container hundred_percent= »yes » overflow= »visible »][fusion_builder_row][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
<?php
/************************************************************************/
/* Script rélisé par Johan VIVIEN (Hotfirenet)
/* Fini le 24 octobre 2008
/* hotfirenet@gmail.com
/* =======================================================================
/*
/* Ce script permet de connaitre le nombre de message archivé et reçu par membre
/* Sur une idee de Oim …
/*
/* This program is free software. You can redistribute it and/or modify
/* it under the terms of the GNU General Public License as published by
/* the Free Software Foundation; either version 2 of the License.
/************************************************************************/
$connect = mysql_connect(‘localhost’, ‘root’,  »);
$selectDB = mysql_select_db(‘lansou’, $connect);

$nbreq = 0;

function sql_query($sql) {
global $nbreq;

$execQuery = mysql_query($sql);
$nbreq++;

return ($execQuery);
}

?>
<html>
<head>
<style>
.rouge {
color: #ff0000;
}
</style>
</head>
<body>
<?php
//On execute la requete, puis on rempli un tableau assossiatif en utilisant comme index l’id
$selectNbMsgFrom = ‘SELECT to_userid, COUNT(*)
FROM priv_msgs
WHERE type_msg = 0
GROUP BY (to_userid)’;
$execNbMsgFrom = sql_query($selectNbMsgFrom);
$tabNbMsgFrom = array();
while($resultNbMsgFrom = mysql_fetch_row($execNbMsgFrom)) {
$tabNbMsgFrom[$resultNbMsgFrom[0]] = $resultNbMsgFrom[1];
}

//Pareil que plus au mais pour connaitre le nombre de message envoy&amp;eacute;
$selectNbMsgTo = ‘SELECT from_userid, COUNT(*)
FROM priv_msgs
WHERE type_msg = 1
GROUP BY (from_userid)’;
$execNbMsgTo = sql_query($selectNbMsgTo);
$tabNbMsgTo = array();
while($resultNbMsgTo = mysql_fetch_row($execNbMsgTo)) {
$tabNbMsgTo[$resultNbMsgTo[0]] = $resultNbMsgTo[1];
}
//Je liste les membres j’associe l’ui en index et le name en valeur
$selectMembre = sql_query(‘SELECT uid, uname FROM users’);
$tabListeMembre = array();
while($listeMembre = mysql_fetch_row($selectMembre)) {
$tabListeMembre[$listeMembre[0]] = $listeMembre[1];
}

echo "&lt;br/&gt;nous faisons pour ce resultat $nbreq requetes<br /><br />";

//Je defini mon tableau et ma variable $i a 0
$tabFinal = array();
$i = 0;
// je commence ma boucle, et je creer un tableau avec mes valeurs
foreach($tabListeMembre as $idMembres => $nomMembres) {
$total = $tabNbMsgTo[$idMembres] + $tabNbMsgFrom[$idMembres];
//Si le membre n’a aucun message je passe son tour
if($total == 0)
continue;

//je rempli mon tableau
$i++;
$tabFinal[‘uname’][$i] = $nomMembres;
$tabFinal[‘msgFrom’][$i] = $tabNbMsgFrom[$idMembres];
$tabFinal[‘msgTo’][$i] = $tabNbMsgTo[$idMembres];
$tabFinal[‘total’][$i] = $total;
}

//faisont un tri sur letableau
arsort($tabFinal[‘total’]);

//Maintenant que j’ai realiser tous mes traitements, j’affiche mon tableau en tenant compte de la colonne total en utilisant comme clé cette colonne …
for(reset($tabFinal[‘total’]); $j = key($tabFinal[‘total’]); next($tabFinal[‘total’])) {
$class = $tabFinal[‘total’][$j] >= 20 ? ‘ class="rouge"’ :  »;

echo ‘<p ‘.$class.’>’.$tabFinal[‘uname’][$j].’ : &amp;agrave; ‘ . $tabFinal[‘msgTo’][$j] . ‘ message(s) re&amp;ccedil;u et &amp;agrave; ‘. $tabFinal[‘msgFrom’][$j] . ‘ archiv&amp;eacute;(s)&lt;br /&gt;’;
echo ‘Total de message pour ‘.$tabFinal[‘uname’][$j].’ : <b>’ . $tabFinal[‘total’][$j] . ‘</b></p><hr />’;
}

?>
</p>
</body>
</html>
[/php]

Merci Oim pour ce petit exercice, bien sympa 😉 ….[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

SQL – Injection SQL ok mais comment l’éviter avec MS SQL avec PHP?

Sous MySQL il existe la fonction mysql_escape_string ou encore mysql_real_escape_string, mais sous MS SQL avec PHP ces fonctions n’existent pas.

Voici une fonction équivalente a mysql_escape_string , mais l’une comme l’autre elles ne protègent pas les caractères % et _.

[php]
function mssql_escape_string($str) {
$str = str_replace("’"," »",$str);
$str = htmlspecialchars($str, ENT_QUOTES);
return $str;
}
[/php]

HowTo – Apache, PHP et Microsoft SQL Server

Voici quelques jours déjà que je bute sur un problème, au travail où je suis nous utilisons le SGBD Microsoft SQL Server, et nous avons des sites intranet en PHP qui tourne sous IIS, mais sur ma machine pour développer je ne me suis pas amusé à installer IIS avec PHP, mais j’utilise tout simplement WAMP (Windows Apache PHP MySQL ) .

Pour me connecter à mon SGBD par PHP, ça ne change pas c’est pareil qu’avec MySQL :

[fusion_builder_container hundred_percent= »yes » overflow= »visible »][fusion_builder_row][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
<?php
define(‘DB_NAME’, ‘mabase’);
define(‘DB_HOST’, ‘monServeur’);
define(‘DB_USER’, ‘monUser’);
define(‘DB_PASSWORD’, ‘monPass’);

$dblink = @mssql_connect(DB_HOST, DB_USER, DB_PASSWORD);

if($dblink) {
$selectdatabase = @mssql_select_db(DB_NAME, $dblink);
if(!$selectdatabase) {
echo ‘erreur lors de la selection de la bdd’;
exit;
}
} else {
echo ‘erreur de connexion a la bdd’;
exit;
}
?>
[/php]
Par contre, lorsque j’ai voulu me connecter à mon SQLEXPRESS qui se trouve sur ma machine, je n’ai jamais pu me connecter à celui-ci !!

Pourtant, mon script de connexion fonctionne bien et j’arrive à me connecter sur un serveur distant qui possède SQL Server, peut être une option n’est pas activée sur mon SQLEXPRESS ?

Après de longues recherches sur Google, j’ai finalement trouvé qu’il y a un problème avec PHP pour se connecter à un SGBD qui possède des instances …

Et oui pour accéder à mon SQLEXPRESS le chemin est bien nommachineSQLEXPRESS, SQLEXPRESS est donc une instance de du SGBD.

Du coup pour que PHP puisse se connecter il faut donc remplacer ntwdblib.DLL qui se trouve pour WAMP dans les répertoires :

  • C:wampbinapacheapache2.2.8
  • C:wampbinphpphp5.2.6
  • C:WindowsSystem32

Également pour vous connecter, il faut dans faire ceci :

[/fusion_builder_column][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
<?php
define(‘DB_NAME’, ‘mabase’);
define(‘DB_HOST’, ‘maMachine\monInstance’);
define(‘DB_USER_UTIL’, ‘monUser’);
define(‘DB_PASSWORD_UTIL’, ‘monPass’);

$dblink = @mssql_connect(DB_HOST, DB_USER, DB_PASSWORD);

if($dblink) {
$selectdatabase = @mssql_select_db(DB_NAME, $dblink);
if(!$selectdatabase) {
echo ‘erreur lors de la selection de la bdd’;
exit;
}
} else {
echo ‘erreur de connexion a la bdd’;
exit;
}

?>
[/php]

Pour télécharger la DLL Google est ton ami[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]

WordPress – Utiliser l’éditeur wysiwyg de wordpress dans ses thèmes et plugins

J’ai eu besoin pour la création d’un thème wordpress de mettre en place l’éditeur avancé tiny_mce.

Après quelques recherches sur le net je suis tombé sur le site de Leeroy qui explique très bien comment le mettre en place.

Mais voici quand même un petit rappel de la procédure de mise en œuvre :

Création d’une fonction d’appel à l’éditeur :
[fusion_builder_container hundred_percent= »yes » overflow= »visible »][fusion_builder_row][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
function init_wysiwyg() {
wp_enqueue_script(‘editor’);
add_thickbox();
wp_enqueue_script(‘media-upload’);
add_action(‘admin_print_footer_scripts’, ‘wp_tiny_mce’, 25);
wp_enqueue_script(‘quicktags’);
}
[/php]
Maintenant nous allons faire appel à cette fonction directement à l’initialisation de l’administration de wordpress :
[/fusion_builder_column][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
add_action(‘admin_menu’, ‘init_wysiwyg’);
[/php]
L’appel de l’editeur se fera de cette façon :
[/fusion_builder_column][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
<?php
/* Syntaxe de la fonction the_editor()
* the_editor($content, $id = ‘content’, $prev_id = ‘title’, $media_buttons = true, $tab_index = 2)
*/
echo the_editor(null);
?>[/php]
Voici à quoi correspond les différents paramètres que peut contenir cette fonction

$content :Contient votre contenu.
$id :Le nom (et ID) du champ de l’éditeur de texte.
$prev_id :Permet de revenir à l’ID précédent des éléments du formulaire.
$media_buttons :Permet d’activer ou désactiver l’affichage des boutons (images, sons, vidéos, etc). Accepte une valeur booléenne (true || false).
$tab_index :Index de tabulation du champ de formulaire.
Maintenant la partie css :
[/fusion_builder_column][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][css]#poststuff textarea
{
-moz-box-sizing:border-box;
border:0 none;
line-height:150%;
outline-color:-moz-use-text-color;
outline-style:none;
outline-width:medium;
padding:6px;
margin:0;
width:100%;
}[/css]
Maintenant quand on regarde de plus prés on s’aperçoit que cette méthode fait que l’éditeur est actif sur toutes les pages de l’administration et personnellement je ne trouve pas cette solution très propre.

En me penchant sur le problème j’ai trouvé la solution qui consiste tout simplement à activer l’appel de l’éditeur uniquement sur les pages du plugin ou du thème.
Mais comment faire ??

La réponse : nous allons utiliser la fonction admin_print_scripts-(page_hook) ou admin_print_scripts-(plugin_page)

Voici comment je l’ai utilisé :
[/fusion_builder_column][fusion_builder_column type= »1_1″ background_position= »left top » background_color= » » border_size= » » border_color= » » border_style= »solid » spacing= »yes » background_image= » » background_repeat= »no-repeat » padding= » » margin_top= »0px » margin_bottom= »0px » class= » » id= » » animation_type= » » animation_speed= »0.3″ animation_direction= »left » hide_on_mobile= »no » center_content= »no » min_height= »none »][php]
function hfn_init() {
/* Syntaxe de la fonction add_menu_page()
* add_menu_page(page_title, menu_title, capability, handle, [function], [icon_url]);
*/
$options_page = add_menu_page( ‘Admin HFN’, ‘Admin HFN’, 7, ‘hfnOptions’, ‘hfnAdmin’, get_template_directory_uri() . ‘/images/icon.png’);
/* Syntaxe de la fonction add_submenu_page()
* add_submenu_page(parent, page_title, menu_title, capability required, file/handle, [function]);
*/
$options_subPage = add_submenu_page( ‘hfnOptions’, ‘Admin HFN’, ‘Gestion de mon module’, 7, ‘hfnOptions’, ‘hfnAdmin’ );
add_submenu_page( ‘hfnOptions’, ‘Admin HFN’, ‘Gestion des menus’, 7, ‘hfnGesMenu’, ‘hfnGesMenu’ );
add_submenu_page( ‘hfnOptions’, ‘Admin HFN’, ‘Aide en ligne’, 7, ‘guide’, ‘hfnGuide’ );</code>

add_action( "admin_print_scripts-$options_subPage", ‘init_wysiwyg’ );
}

add_action(‘admin_menu’, ‘hfn_init’);
[/php]
Dans le cas ci-dessus je voulais que l’éditeur soit appelé uniquement sur la page, gestion de mon module il me suffit juste de mettre le contenu de la fonction add_submenu_page() dans ma variable $options_subPage, puis tout simplement compléter la fonction admin_print_scripts-$maVariable() en utilisant add_action().

En espérant que cet article pourra servir à d’autres personnes.[/fusion_builder_column][/fusion_builder_row][/fusion_builder_container]