这个php更新代码有什么问题

时间:2013-08-12 11:52:53

标签: php pdo

我创建了这个代码来更新mysql,似乎没有工作。我尽了最大努力,但仍然没有用。它没有更新我的数据库。可能是什么问题呢? 我的配置页

<?php

define("dbuser", "XX");

define("dbpass", "XX");

define("dbhost", "localhost");

define("dbname", "smsplugin");

?>

$smsbal = $_POST['smsbal'];
$values =$_POST['values'];
$api = $_POST['api'];

$db = new PDO('mysql:host='.dbhost.';dbname='.dbname.';charset=utf8', dbuser, dbpass);
$sql="UPDATE user SET api=?,values=?,left=? WHERE id='1'";
$q=$db->prepare($sql);
$q->execute(array($api,$values,$smsbal));

<form method="POST" action="" class="well form-horizontal" style="width:338px;margin:0 auto;"><br />
<br />

<p>
<label for="api"><strong>API Setting</strong></label>

<input type="text" name="api" id="api"  data-placement="right" data-html="true" data-animation="true"/>
</p>
<p>
<label for="values"><strong>API Values</strong></label>
<input type="text" name="values" id="values" title="These are the values that are passed to your SMS provider; <strong>Sender, Receiver and the Message</strong>. Depending on the 
setting of your SMS Provider, ensure that <em>$sender</em> is use for the sender value, <em>$receipient</em> is used for the receiver value and <em>$message</em> is used for the message value like in the
example below  <br /><strong>NOTE: CHANGE 'sender=','receipient=' and 'message=' TO THE ACCEPTED VARIABLES OF YOUR SMS PROVIDER.</strong>
sender=$sender&recipient=$recipient&message= $message" value="<?php print $fapi ;?>"  data-placement="right" data-html="true" data-animation="true"/>
</p>
    <p>
<label for="smsbal"><strong>SMS Balance</strong> (optional)</label>

<input type="text" name="smsbal" id="smsbal" title="This is the script that checks the remaining balance of your SMS unit. <br />
<strong>NOTE: ENTER THE ACCEPTED VARIABLE AND VALUE OF YOUR SMS PROVIDER.</strong><strong>E.g: bal=true</strong>" data-placement="right" data-html="true" data-animation="true" />
</p>
  <div class="control-group">
       <button type="submit" name="save" value="save" class="btn-primary btn-mini">Save</button>
  </div>
</form>

3 个答案:

答案 0 :(得分:7)

最大且最重要的问题缺少错误报告

它不仅破坏了这个特殊的问题,而且破坏了你对PHP的整体体验 每当出现问题时,PHP都会告诉你 - 发生了什么以及应该责怪谁。只有你这样做。你永远都应该。

您被告知要在评论中检查错误。但由于某种原因没有注意到它。好的,这里有一个解释:

为了能够查看数据库错误,必须将PDO errmode设置为异常。异常在许多方面优于常规错误:它们总是包含堆栈跟踪,可以使用try..catch捕获它们或使用专用错误处理程序处理它们。甚至未处理,它们充当常规PHP错误,提供所有重要信息,遵循站点范围的错误报告设置。

请注意,将此模式设置为连接选项会让PDO也会对连接错误抛出异常,这非常重要 因此,这是一个以正确方式创建PDO连接的示例:

$dsn = "mysql:host=$host;dbname=$db;charset=utf8";
$opt = array(
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    // other options 
);
$pdo = new PDO($dsn, $user, $pass, $opt);

以这种方式连接,将始终通知您在查询执行期间发生的所有数据库错误。请注意,您必须能够查看PHP错误。在实际站点上,您必须查看错误日志,因此,必须设置

error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);

在本地开发服务器上,可以在屏幕上显示错误:

error_reporting(E_ALL);
ini_set('display_errors',1);

当然,您永远不应该在PDO语句前使用错误抑制运算符(@)。

此外,由于许多不良示例告诉您将每个PDO语句包装到try..catch块中,我必须做一个明确的说明:

  

请勿使用try..catch运算符来回显错误消息。未捕获的异常已经很好用于此目的,因为它的行为方式与其他PHP错误相同 - 所以,你可以使用站点范围的设置来定义行为 - 因此,您将收到错误消息而没有此无用的代码。 虽然无条件回显的错误消息可能会向潜在的攻击者泄露一些敏感信息,但会混淆一个诚实的访客。

     
      
  • 以后可以添加custom exception handler,但不是必需的。特别是对于新用户,建议使用未处理的异常,因为它们提供的信息非常丰富,有用且安全。
  •   
  • 仅当您要处理错误本身时才使用try..catch - 例如,回滚事务。
  •   

收到错误后,您将知道SQL在left字上被阻塞,该字在mysql中保留并且必须格式化:

 UPDATE user SET api=?,values=?,`left`=? WHERE id='1'

答案 1 :(得分:-1)

尝试在PHP中打开和关闭标记包装PHP

<?php

... Your php

?>
<SomeHtml>
....

此外,您的db变量是常量还是应该使用$ eg $ dbhost而不是dbhost作为前缀。

答案 2 :(得分:-1)

你可以试试这个:

<?php
    if($_POST){
        $smsbal = $_POST['smsbal'];
        $values =$_POST['values'];
        $api = $_POST['api'];

        //echo $api; No need to print it!

        $db = new PDO('mysql:host='.dbhost.';dbname='.dbname.';charset=utf8', dbuser, dbpass);
        $sql="UPDATE user SET api= :api, values= :values, left= :left WHERE id='1'";
        $q = $db->prepare($sql);
        $q->bindValue(':api', $api);
        $q->bindValue(':values', $values);
        $q->bindValue(':left', $left);
        $q->execute();
    }
?>