2012-01-18 14 views
1

2つのテーブルから製品名、カテゴリ名、製品IDを取得する簡単なスクリプトをまとめました。それから、私はそのデータをとり、SEO目的のために現在持っているものよりも優れたページタイトルを作成するためにそれを使用します。何らかの理由で、私はそれが実行するのにかかる時間がかかるとは思わなかった。 7k製品があります。このPHPスクリプトをより適切に処理する方法はありますか? - タイムアウトの問題

私のホスティング会社はカスタムphp.iniの作成を許可しているので、30秒の制限時間を無効にして6000に変更することができました。しかし、スクリプトはタイムアウトします。だから私は脚本が駄目だと思った。 :)

以下はスクリプトです。タイムアウトしないようにこれを書くことができるより良い方法はありますか?それとも、私がやろうとしているのはちょっと時間がかかりますから、一度に1つのカテゴリを行うスクリプトを書く必要がありますか?

<?php 
// Make a MySQL Connection 
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error()); 
mysql_select_db("mydatabase") or die(mysql_error()); 

$result = mysql_query("SELECT isc_products.prodcode, isc_products.prodname, isc_categories.catname FROM isc_products, isc_categories WHERE isc_products.prodcatids = isc_categories.categoryid") 
or die(mysql_error()); 


while($row = mysql_fetch_array($result)){ 
$pname = mysql_real_escape_string($row['prodname']); 
$catname = mysql_real_escape_string($row['catname']); 
$sitename = Sitename; 
$prodcode = $row['prodcode']; 
$result2 = mysql_query("UPDATE isc_products SET prodpagetitle = '$pname - $catname - $sitename' WHERE prodcode = '$prodcode'") 
or die(mysql_error()); 
} 

?> 

indexes http://www.threewestcreative.com/indexes.jpg

おかげで、あなたの助けが理解されます。 :)

大変ありがとうございます!私は本当に迅速な対応に感謝します。私はデータベース(phpなし)に対して直接クエリを実行するほど単純なものを見落としたとは思えません。さあ、もう一度ありがとう!

+0

非常に多くの行を選択しているので、Navicatのようなものを使用して、データベースがボトルネックであるかどうかを判断する(phpではなく)直接クエリを実行してみてください。 – F21

+0

データベースでインデックスを使用していますか?それはすべての違いになります。 – Frankie

+0

mysqlから取得したデータをmysql_real_escape_stringする必要はありません。また、あなたのサイト名の定数が表示されません?また、これを行う必要はありません。PHPを使用しなくても、選択した行からmysqlデータを更新できます。http://www.electrictoolbox.com/article/mysql/cross-table-update/ – Steven

答えて

2

はちょうどあなたがちょうどあなたがやりたい1つのクエリを使用することができます

+0

これはPhpMySQLでこれを実行した場合、これはテーブル内のすべてのアイテムレコードに影響しますか?私はあなたが何を言っているかを見ます。私はこれでかなり新しいので、私は1つのモード(PHPスクリプトをやっている)で立ち往生していると思う。 – Tsanders

+0

UPDATEはWHERE句を実行するすべての行で実行されます.1つもないので、UPDATEはすべてのレコードに対して実行されます。SELECTが1つのクエリで多くの行を与えるのと同じ方法でUPDATEは1つのクエリで多くの行を更新できます。 –

+0

私は今理解しています。どうもありがとうございます!私はphpmyadminで単一のクエリを実行する単純な行為を見落としていました。 – Tsanders

1

もしそれがタイムアウトする、あなたのDBは、魚(行方不明のインデックス?)である

UPDATE isc_products 
INNER JOIN isc_categories ON isc_products.prodcatids = isc_categories.categoryid 
SET isc_products.prodpagetitle=CONCAT(isc_products.prodname,' - ',isc_categories.catname,' - $sitename'); 

を実行します。

UPDATE ssc_products, isc_categories 
SET psc_products.prodpagetitle = CONCAT_WS(' - ', isc_products.prodname, isc_categories.catname, $sitename) 
WHERE isc_products.prodcatids = isc_categories.categoryid; 
0

テーブルの構造を表示できますか?多くの製品を扱う際に重要なのは、索引付けが重要な点です。また、(while)ループが悪い場合は、パフォーマンスに影響します。上記の1人の質問と同様に、このトリックを行う必要があります。

0

PHPでこれをやっている理由はわかりません.1つのUPDATEでこれを達成できるとすれば、わかりません。おそらく、すでにレコードが変更されているかどうかを識別するようなことをするビットを残しているのでしょうか?

だから、PHPでこれをやりたいと思っていて、テーブル全体でprodpagetitleフィールドを更新するには、このスクリプトに1回だけ実行したいと思います。

1つのオプションは、これを別々のスクリプトに分割することです。 SELECTを実行するメインスクリプトを作成し、GETの変数で使用するデータとともに2番目のスクリプトを呼び出すことでUPDATEをスキップします。例えば:

<?php 
// Make a MySQL Connection 
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error()); 
mysql_select_db("mydatabase") or die(mysql_error()); 

$result = mysql_query("SELECT isc_products.prodcode, isc_products.prodname, isc_categories.catname FROM isc_products, isc_categories WHERE isc_products.prodcatids = isc_categories.categoryid") 
or die(mysql_error()); 

while ($row = mysql_fetch_array($result)) { 
    $pname = mysql_real_escape_string($row['prodname']); 
    $catname = mysql_real_escape_string($row['catname']); 
    $sitename = Sitename; 
    $title=sprintf("%s - %s - %s", $pname, $catname, $sitename); 
    $url=sprintf("http://example.com/update.php?pcode=%s&title=%s", $row['prodcode'], $title); 
    $junk=file_get_contents($url) 
} 

?> 

と:これは、例えばコード考慮されるべきである

<?php 

// This is update.php, called by the script above. 
mysql_connect("localhost", "myusername", "mypassword") or die(mysql_error()); 
mysql_select_db("mydatabase") or die(mysql_error()); 

$qfmt="UPDATE isc_products SET prodpagetitle = '%s' WHERE prodcode='%s'"; 
mysql_query(sprintf($qfmt, $_GET['pcode'], urldecode($_GET['title'])); 

?> 

ノード。私はそれを試していないし、計画していない。既に変更されたフィールドをマークするための機能をいくつか含めることで、新しいスクリプトがタイムアウトしたときに中断した場所から続けることができます(おそらくそうなります)。このスクリプトには脆弱性が含まれているため、安全な環境で実行するか、重要な変更を加えて安全に実行する必要があります。 </fineprint>

関連する問題