PHP mySql更新在localhost上工作正常但在live时没有

时间:2010-07-26 23:13:38

标签: php mysql live

我有一个更新mySql数据库的php页面,它在我的mac上工作正常(localhost使用mamp)

我检查了它的连接是否有连接

 <?php require_once('connection.php'); ?>

 <?php  
  $id = $_GET['id'];
  $collumn = $_GET['collumn'];
  $val = $_GET['val'];
 // checking if there is a connection
 if(!$connection){
     echo "connectioned failed";
   }
  ?>


 <?php 
    $sqlUpdate = 'UPDATE plProducts.allPens SET '. "{$collumn}".' = '."'{$val}'".' WHERE allPens.prodId = '."'{$id}'".' LIMIT 1';
    mysql_query($sqlUpdate);
    // testing for errors
   if ($sqlUpdate === false) {
      // Checked this and echos NO errors.
     echo "Query failed: " . mysql_error();
    }

if (mysql_affected_rows() == 1) {
  echo "updated";
} else {
  echo "failed";
}?>

在我传入参数的URL中,它看起来像这样:http://pathToSite.com/updateDB.php?id=17&collumn=prodid&val=4

也许这与托管有关?这个简单的PHP mySql数据库更新不是这个吗?这可能有什么不对?

为什么在localhost上它确实有效?

为什么在实时服务器上没有?

3 个答案:

答案 0 :(得分:1)

如果遇到错误,大多数mysql函数都会返回FALSE。您应检查错误情况,如果出现错误,请输出错误消息。这将使您更好地了解问题发生的位置以及问题的本质。

令人惊讶的是,尽管PHP文档中有许多示例,但许多程序员从未检查错误状态。

$link = mysql_connect(...);
if ($link === false) {
    die(mysql_error());
}

$selected = mysql_select_db(...);
if ($selected === false) {
    die(mysql_error());
}

$result = mysql_query(...);
if ($result === false) {
    die(mysql_error());
}

答案 1 :(得分:1)

让我们首先解决您的确切问题。您的查询由于某种原因失败了。我们可以通过检查mysql_query返回的内容来找出问题所在,如果它是布尔值假,则问mysql_error出了什么问题:

$sh = mysql_query($sqlUpdate);
if($sh === false) {
    echo "Query failed: " . mysql_error();
    exit;
}

你还有其他问题。最大的问题是您的代码遇到an SQL Injection vulnerability。假设您的脚本名为foo.php。如果我要求:

foo.php?collumn=prodId = NULL -- 

然后你的SQL会出现如下:

UPDATE plProducts.allPens SET prodId = NULL -- = "" WHERE allPens.prodId = "" LIMIT 1

--是一条SQL评论。

我只是设法核对表格中的所有产品ID。

停止SQL注入的最有效的方法是使用预准备语句占位符。 PHP中的“mysql”扩展不支持它们,因此您还需要切换到必须更好的mysqli扩展名或PDO扩展名。

让我们使用PDO预处理语句来确保您的查询安全。

// Placeholders only work for *data*.  We'll need to validate 
// the column name another way.  A list of columns that can be
// updated is very safe.
$safe_columns = array('a', 'b', 'c', 'd');
if(!in_array($collumn, $safe_columns))
    die "Invalid column";
// Those question marks are the placeholders.
$sqlUpdate = "UPDATE plProducts.allPens SET $column = ? WHERE allPens.prodId = ? LIMIT 1";
$sh = $db->prepare($sqlUpdate);
// The entries in the array you pass to execute() are substituted
// into the query, replacing the placeholders.
$success = $sh->execute(array( $val, $id ));
// If PDO is configured to use warnings instead of exceptions, this will work.
// Otherwise, you'll need to worry about handling the exception...
if(!$success)
    die "Oh no, it failed!  MySQL says: " . join(' ', $db->errorInfo());

答案 2 :(得分:1)

您对mysql_query()的来电有误;你正在检查你传入的变量的内容,但函数调用不是这样的。它返回一个你应该检查的值。如果查询失败,则返回false。如果它返回数据(如来自SELECT),则返回资源句柄。如果成功但没有返回数据(例如来自INSERT),则返回true。

构建SQL时也遇到一些问题。 @Charles提到SQL注入并建议准备好的语句。如果您仍想构建查询字符串,则需要使用mysql_real_escape_string()。 (但我建议你阅读mysqli扩展名,然后使用这些功能。)

其次,您将字符串与嵌入式替换连接起来。这太傻了。这样做是这样的:

 $sqlUpdate = 'UPDATE plProducts.allPens SET '.$collumn.' = \''.$val.'\' 
        WHERE allPens.prodId = '.intval($id).' LIMIT 1';

如果您必须在查询字符串中接受它,则还应在使用之前检查$collumn是否设置为有效值。如果不是,则发出错误页面。同样,请检查$id是否会变为数字(使用is_numeric())。所有这些都被称为防御性编程