我创建此代码来更新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>
Run Code Online (Sandbox Code Playgroud)
您最大的问题是缺少错误报告.
它不仅破坏了这个特殊问题,还破坏了您使用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);
Run Code Online (Sandbox Code Playgroud)
通过这种方式连接,您将始终收到查询执行期间发生的所有数据库错误的通知.请注意,您必须能够查看PHP错误.在实际站点上,您必须查看错误日志,因此必须进行设置
error_reporting(E_ALL);
ini_set('display_errors',0);
ini_set('log_errors',1);
Run Code Online (Sandbox Code Playgroud)
在本地开发服务器上,可以在屏幕上出错:
error_reporting(E_ALL);
ini_set('display_errors',1);
Run Code Online (Sandbox Code Playgroud)
当然,您永远不应该@在PDO语句前面使用错误抑制operator().
此外,由于许多不好的例子告诉你将每个PDO语句包装成try..catch块,我必须做一个明确的说明:
请勿使用try..catch运算符来回显错误消息.为此目的,未捕获的异常已经非常出色,因为它的行为与其他PHP错误的行为方式相同 - 因此,您可以使用站点范围的设置来定义行为 - 因此,您将获得没有此无用代码的错误消息. 虽然无条件回复的错误消息可能会向潜在的攻击者泄露一些敏感信息,但却会使诚实的访问者感到困惑.
- 一个自定义异常处理程序可以在以后添加,但不是必需的.特别是对于新用户,建议使用未处理的异常,因为它们提供的信息非常丰富,有用且安全.
- 用
try..catch说,回滚事务-只有当你要处理错误本身.
在收到错误之后,您将知道SQL left在mysql中保留的单词上被阻塞并且必须格式化:
UPDATE user SET api=?,values=?,`left`=? WHERE id='1'
Run Code Online (Sandbox Code Playgroud)