2010-02-04 90 views
1

我想通过PHP中的URL中的多个变量来获取一些信息,但我不认为它的工作。如何在PHP中通过URL传递多个变量?

$allowedFunctions = array(
    'returnAllProducts', 
    'refreshCurrentProduct' 

); 


$IDNUM = $_GET[ 'idNum' ]; 


$functionName = $_GET[ 'func' ]; 

if(in_array($functionName, $allowedFunctions) && function_exists($functionName)) 
{ 
    $functionName(); 
} 

然后我有refreshCurrentProduct功能:

function refreshCurrentProduct() { 
$dbh=mysql_connect ("DATABASE","USER", "PASS") or die('I cannot connect to the database because:'. mysql_error()); 

mysql_select_db("TABLE"); 

$query = "SELECT `ID` FROM `PRODUCTS`"; 

$result = mysql_query($query) or die('Query failed:'.mysql_error()); 

$DB_STOCK = mysql_query("SELECT `STOCK` FROM `PRODUCTS`") or die('Query failed:'.mysql_error()); 

$DB_SHORT = mysql_query("SELECT `MYNAME` FROM `PRODUCTS`") or die('Query failed:'.mysql_error()); 

$DB_LONG = mysql_query("SELECT `DESCRIPTION` FROM `PRODUCTS`") or die('Query failed:'.mysql_error()); 

$DB_PRICE = mysql_query("SELECT `PRICE` FROM `PRODUCTS`") or die('Query failed:'.mysql_error()); 

$DB_SHIP = mysql_query("SELECT `SHIPPING` FROM `PRODUCTS`") or die('Query failed:'.mysql_error()); 


$ID = mysql_result($result,$IDNUM,"ID"); 
    $STOCK = mysql_result($DB_STOCK,$IDNUM,"STOCK"); 
    $SHORT = mysql_result($DB_SHORT,$IDNUM,"MYNAME"); 
    $LONG = mysql_result($DB_LONG,$IDNUM,"DESCRIPTION"); 
    $PRICE = mysql_result($DB_PRICE,$IDNUM,"PRICE");   
    $SHIP = mysql_result($DB_SHIP,$IDNUM,"SHIPPING"); 

    echo ' 
    //echo $STOCK, $SHORT, etc.... 

    '; 
} 

我使用的URL是products.php?func=refreshCurrentProduct&idNum=4

从理论上讲,应该从排在它4显示,但是,只有它显示第一行的信息。如果我在函数中做了$IDNUM=5,它会显示第5行,所以我传递信息的方式有些问题。

另外,如何创建(例如)$ STOCK而不必在$ DB_STOCK中包含太多的代码?似乎必须有更好的方式...

+0

'mysql_error'公开错误消息的详细信息(http://msdn.microsoft.com/en-us/library/ms995351.aspx#securityerrormessages_topic2)。此外,旧的MySQL驱动程序相当过时。看看PDO(http://php.net/PDO)并准备报表。 – outis 2010-02-04 20:07:30

回答

2

你为什么不这样做(如其他已经提到,$IDNUM不在功能范围内):

function refreshCurrentProduct() { 
    $dbh=mysql_connect ("DATABASE","USER", "PASS") or die('I cannot connect to the database because:'. mysql_error()); 
    mysql_select_db("TABLE"); 

    // If $_GET['idNum'] is not a number use 0 
    $rowNumber = is_numeric($_GET['idNum']) ? $_GET['idNum'] : 0; 

    $query = "SELECT ID, STOCK, MYNAME, DESCRIPTION, PRICE, SHIPPING FROM `PRODUCTS`"; 
    $result = mysql_query($query); 

    if(mysql_data_seek($result, $rowNumber)) { 
     // The result set has indeed at least $rowNumber rows 

     $row = mysql_fetch_assoc($result); 

     echo $row['ID']; 
     echo $row['STOCK']; 
     // ... etc .... 
    } 
    else { 
     echo "No such row!"; 
    } 
} 

不需要打六次数据库!当然你需要添加错误处理。

Btw。是参数idNum与数据库中记录的ID相同吗?如果是这样,您甚至可以进一步简化:

function refreshCurrentProduct() { 
    $dbh=mysql_connect ("DATABASE","USER", "PASS") or die('I cannot connect to the database because:'. mysql_error()); 
    mysql_select_db("TABLE"); 

    // If $_GET['idNum'] is not a number use 0 
    $id = is_numeric($_GET['idNum']) ? $_GET['idNum'] : 0; 

    $query = "SELECT ID, STOCK, MYNAME, DESCRIPTION, PRICE, SHIPPING FROM `PRODUCTS` WHERE ID = $id"; 
    $result = mysql_query($query); 

    if (mysql_num_rows($result) == 0) { 
     echo "No rows found, nothing to print"; 
     return; 
    } 

    $row = mysql_fetch_assoc($result); 

    echo $row['ID']; 
    echo $row['STOCK']; 
    // ... etc .... 
} 
+0

+2用于SQL改进 – outis 2010-02-04 20:07:59

+0

谢谢Felix! – Jared 2010-02-08 13:53:13

2

看看call_user_func

$functionName = $_GET[ 'func' ]; 

if(in_array($functionName, $allowedFunctions) && function_exists($functionName)) 
{ 
    call_user_func($functionName); 
} 

而且,如果我在读你的代码的权利,你可以得到所有的信息在一个单一的查询:

$query = "SELECT `ID`,`STOCK`,`MYNAME`,`DESCRIPTION`,`PRICE`,`SHIPPING` FROM `PRODUCTS`"; 
$result = mysql_query($query) or die('Query failed:'.mysql_error()); 
while ($row = mysql_fetch_assoc($result)) { 
    $ID=$row['ID']; 
    //etc. 
} 
+0

不完全,OP想要获得某一行,而不是所有的行。 – 2010-02-04 19:50:40

+0

Btw'$ functionName()'不是OP的问题。这按预期工作。 – 2010-02-04 20:06:18

1

您的$IDNUM变量超出了您的函数范围。你或者需要将它作为变量传递给你的函数,或者你应该可以通过在函数内部设置它来设置它。

function refreshCurrentProduct() { 
    $IDNUM = $_GET[ 'idNum' ]; 
    ... 
} 
+0

谢谢你的帮助! – Jared 2010-02-08 13:53:58