想在您的WEB APPLICATION加入GD的功能嗎?

想要自己做出漂亮精緻的報表嗎?

那就要好好學習GD了, 它是跟PHP搭配得非常棒的圖像模組,

若您已經對PHP瞭如指掌,那學習GD將會讓您的WEB程式設計功力更加大增.

以下網站將GD的功能與教學都說明得很清楚, 若您是GD入門者, 這個網站將非常適合您.

http://www.nyphp.org/content/presentations/GDintro/gd1.php

GD 管方網站: http://www.boutell.com/gd/

Some of you might be using the following directive to do Random Picking from your MYSQL database, which is mysql_query("SELECT * FROM table ORDER BY RAND() LIMIT 10″);

However, It is not a good way if your website is in a high-flow-situation, Using such directive might causing a big loading in your hosting machine, here’s the alternative way to replace such directive, (special thanks to Nicky Soo for providing this method),

The code should be look like this:

mysql_query(" SELECT *
FROM news AS r1 JOIN
(SELECT (RAND() *
(SELECT MAX(newsid) FROM news)) AS newsid) As r2
WHERE `display` =1
AND r1.newsid >= r2.newsid
AND r1.counter >50
LIMIT 0 , 10  ")

Cheers!

<?php

//This gets today’s date
$date =time () ;

//This puts the day, month, and year in seperate variables
$day = date(‘d’, $date) ;
$month = date(‘m’, $date) ;
$year = date(‘Y’, $date) ;

//Here we generate the first day of the month
$first_day = mktime(0,0,0,$month, 1, $year) ;

//This gets us the month name
$title = date(‘F’, $first_day) ;

//Here we find out what day of the week the first day of the month falls on
$day_of_week = date(‘D’, $first_day) ;

//Once we know what day of the week it falls on, we know how many blank days occure before it. If the first day of the week is a Sunday then it would be zero
switch($day_of_week){
case "Sun": $blank = 0; break;
case "Mon": $blank = 1; break;
case "Tue": $blank = 2; break;
case "Wed": $blank = 3; break;
case "Thu": $blank = 4; break;
case "Fri": $blank = 5; break;
case "Sat": $blank = 6; break;
}

//We then determine how many days are in the current month
$days_in_month = cal_days_in_month(0, $month, $year) ;

//Here we start building the table heads
echo "<table id=wp-calendar summary=Calendar>";
echo "<CAPTION>$title $year </CAPTION>";
echo "<tr>
<TH title=Monday scope=col abbr=Monday>M</TH>
<TH title=Tuesday scope=col abbr=Tuesday>T</TH>
<TH title=Wednesday scope=col abbr=Wednesday>W</TH>
<TH title=Thursday scope=col abbr=Thursday>T</TH>
<TH title=Friday scope=col abbr=Friday>F</TH>
<TH title=Saturday scope=col abbr=Saturday>S</TH>
<TH title=Sunday scope=col abbr=Sunday>S</TH>";

//This counts the days in the week, up to 7
$day_count = 1;

echo "<tr>";
//first we take care of those blank days
while ( $blank > 0 )
{
echo "<td></td>";
$blank = $blank-1;
$day_count++;
}

//sets the first day of the month to 1
$day_num = 1;

//count up the days, untill we’ve done all of them in the month
while ( $day_num <= $days_in_month )
{
if($day_num == $day) {
echo "<td id=today> $day_num </td>";
} else {
echo "<td > $day_num </td>";
}
$day_num++;
$day_count++;

//Make sure we start a new row every week
if ($day_count > 7)
{
echo "</tr><tr>";
$day_count = 1;
}
}

//Finaly we finish out the table with some blank details if needed
while ( $day_count >1 && $day_count <=7 )
{
echo "<td> </td>";
$day_count++;
}

echo "</tr></table>";

?>

有時候我們會在同一個頁面同時使用兩個資料庫,

若連線字串是放在CLASS的CONSTRUCTOR裡面, 通常我們都只要NEW 一次, 就可以一直保持資料庫連線,

但若兩個資料庫交替使用, 則會發生連線字串混亂的狀況.

此時應該在CLASS裡面每個FUNCTION都的MYSQL_QUERY之前都指定連線字串,

這樣就可以保持一MYSQL_QUERY對應一個資料庫的狀況了.

class sample {

function DATABASE() {
include("db1.php");

}

function FIRSTCONNECT() {
$this->DATABASE();
mysql_query("…..");
}

}

class sample2 {

function DATABASE2() {
include("db2.php");

}

function ANOTHERCONNECT() {
$this->DATABASE2();
mysql_query("…..");
}

}

$firstclass = new sample;

$secondclass = new sample2;

$secondclass->ANOTHERCONNECT(); //讀取自DB2 的資料庫

$firstclass->FIRSTCONNECT(); //讀取自DB1 的資料庫

最近在撰寫PHP程式的時候遇到了兩個花費我不少時間的問題.

第一個問題:

我們常常在設計表單的時候都會設計 新增, 刪除, 編輯的功能, 在完成這些功能之後, 我們習慣用 header("Location: xx.php"); 回到瀏覽列表. 但有時候我們在編輯成功回到瀏覽列表後(沒有錯誤訊息), 但資料卻沒有被編輯修改成功. 最糟糕的是MYSQL_ERROR() 也帶不出到底問題出在哪裡. 這個時候就可以推斷是ID 沒有被送入MYSQL.

比如說: mysql_query("UPDATE products SET title = ‘$title’ WHERE id = ‘$id’") or die(mysql_error());

這個時候, 如果你的$id 變數值是 "" 也一樣會通過指令, MYSQL 不會告訴你有錯誤. 所以無論你怎麼試都還是發現指令明明就沒問題但怎樣就是沒辦法UPDATE成功.

第二個問題:

還有另一個可能性是出在一個天殺的錯誤:

<input type="hidden" name="id" values="<?php echo $_GET['id']; ?>" />

當我們想要用隱藏表單傳送ID值的時候, 會用以上的HTML來傳送, 你發現問題出在哪裡嗎?

答案很明顯, 就是 "values" ! values 是沒有 "s"的, 多了一個"s" 你的表單就送不出去ID這個值了.

正解: <input type="hidden" name="id" value="<?php echo $_GET['id']; ?>" />

若這個問題剛好與以上的問題碰在一起, 肯定會在DEBUG上花很時間.

表面上看起來很簡單的問題, 有時候會搞到我們抓狂都找不到BUG. 在這裡與大家分享經驗.

想要自己用PHP動態做出美麗的圖? 卻又不想花大錢去買別人寫好的套件?

不用慌張, 因為這個網站會教你怎麼一步一步學GD, 趕快用你的PHP中內建的GD function來畫圖吧!

動一動腦筋可以做出意想不到的效果呢.

http://www.nyphp.org/content/presentations/GDintro/

有時候我們用中文存取MYSQL資料庫資料的時候會出現亂碼,
又也許你在PHPMYADMIN看到的時候是明碼, 但用echo抓出來後卻是" ??? " 的亂碼.
又或是在儲存的時候就已經是亂碼了, 要怎麼解決呢?

可以試試看以下的方法:

mysql_query("SET NAMEs 'utf8' ");
$sql = mysql_query("SELECT * FROM wp_posts where ID = 2");

不管INSERT 或是SELECT出來, 都在mysql_query前加入

 "SET NAMES 'utf8' " 

就可以確保資料庫存取時是以UTF-8的編碼儲存, 那在做資料轉換的過程應該就可以把編碼問題解決了~

在Silverlight宣告事件的方式有兩種:

  • 直接在XAML內部宣告 (優點:簡單明瞭, 缺點: 只能使用預設的參數, 不能再加參數)
  • 在.cs裡面作宣告 (優點: 彈性大, 可以做變化; 缺點: 比較困難(吧~) )

第一種方式:

在XAML直接作宣告(eg. 在Page.xaml):

<Canvas Loaded="Canvas_Loaded">

<Button x:Name="myButton" Content="Hello"

Canvas.Left="10″ Canvas.Top="10″ />

</Canvas>

在Page.xaml.cs作處理:

private void Canvas_Loaded(object sender, RoutedEventArgs e)

{

theButton.Content = "Please Click Me";

}

第二種方式

不需在XAML裡面宣告事件

<!– <Canvas  Loaded="Canvas_Loaded"> –>

<Canvas >

<Button x:Name="theButton" Content="I’m Indented!"

Canvas.Left="150″ Canvas.Top="20″ />

<CheckBox x:Name="RushOrder" Content="Rush"

Canvas.Left="50″ Canvas.Top="20″ FontSize="18″ />

</Canvas>

而是直接在Page.xaml.cs的Page( ) Constructor動手腳~

public Page()

{

InitializeComponent();

Loaded += new RoutedEventHandler(Page_Loaded);

}

void Page_Loaded(object sender, RoutedEventArgs e)

{

/*throw new NotImplementedException(); 去掉這行 */

theButton.Click +=new RoutedEventHandler(theButton_Click); //事件1

RushOrder.Checked += new RoutedEventHandler(RushOrder_Changed); //事件2

RushOrder.Unchecked +=new RoutedEventHandler(RushOrder_Change); //事件3

}

void RushOrder_Changed(object sender, RoutedEventArgs e)

{

if (RushOrder.IsChecked == true)

{

RushOrder.Content = "RUSH";

}

else

{

RushOrder.Content = "Rush";

}

}

在SilverLight中用來規劃整個版面Layout的Control主要有三種:

  • Grid: 就像Table一樣, 將物件以行列的方式對齊
  • StackPanel: 讓物件之間相對對齊, 如相鄰對齊或向上對齊
  • Canvas: 用絕對對齊(absolute positioning) 的方式放置物件(與SilverLight 1.0相符)

Grid

Grid 在使用VS2008開啟新檔案的時候就已經存在XAML裡面了, 格式會長這個樣子:

<UserControl x:Class="EasyGrid.Page"

xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

Width="400″ Height="300″>

<Grid x:Name="LayoutRoot" Background="White">

</Grid>

你可以先規劃整個SilverLight App的框線, 以便之後的對齊作業, 定義的方式如下:

<Grid x:Name="LayoutRoot" Background="White">

<Grid.RowDefinitions>

<RowDefinition Height="50″ />

<RowDefinition Height="30*" MaxHeight="70″ />

<RowDefinition Height="40*" MaxHeight="70″ />

<RowDefinition Height="*" MinHeight="30″ MaxHeight="50″ />

<RowDefinition Height="Auto" MinHeight="5″ MaxHeight="30″ />

</Grid.RowDefinitions>

</Grid>

Height: 每一列的高度

MaxHeight: 能夠拉伸的最大高度 (* 表示以比例的方式定義高度, 兩倍高就是 2*)

MinHeight: 能夠拉伸的最小高度

StackPanel

Stack就是堆疊的意思, 使用StackPanel你可以將你的物件以左右堆疊或者上下堆疊的方式排列, 就像書本在書架上一樣. 它也是在SilverLight2.0經常使用的對齊工具. 下面以放置TextBlock, TextBox, CheckBox及Button 為例:

<StackPanel Background="Beige" Orientation="Vertical" >

<TextBlock Text="Your name?"

HorizontalAlignment="Left" Margin="10,2,0,1″/>

<TextBox Width="150″ Height="30″

HorizontalAlignment="Left" Margin="10,2,0,1″/>

<Button Content="Submit this information"

HorizontalAlignment="Left"

Margin="10,2,0,1″ Height="30″ Width="150″ />

<CheckBox Content="With Zing!" HorizontalAlignment="Left"

Margin="10,2,0,1″ />

</StackPanel>

屬性:

Background: Stack背景的顏色

Orientation: 排列方向, Vertical是垂直
在StackPanel內部的物件Margin="10,2,0,1″ 的Margin順序是左, 上, 右, 下.