PHP MySQLi准备语句绑定某些字符的错误?

时间:2015-09-07 03:30:25

标签: php database mysqli bind

第一次发布到StackOverflow,但我在这里的评论已经很久了。

我遇到了几个小时后我无法弄清楚的编程错误,并且在问题和答案中找不到任何似乎适用的内容,所以这是我的第一篇文章!

我使用PHP和MySQLi预处理语句将源自文件的数据插入数据库,并将文件中的每条记录存储到一个数组($ dbData [])中,该数组传递给执行的函数数据库存储。我检查了每个记录的所有四个索引的数组值,并且数据存在于所有记录字段中,尽管在一些字符串中有很多斜杠(向前和向后),撇号,引号(单和双)和html标记内容。

$ dbData数组与插入表中的列相关联。 该表被称为"内容"并且它对第二列有一个约束,它不能为null。它命名为' CText'。

对数据数组进行操作的代码位于一个函数中,该函数在循环内为所有文件数据调用。我在没有功能界面的情况下提供以下功能的内容。出于简化目的,我已经包含了连接到数据库的代码,但实际创建数据库连接的代码位于函数外部。

$mysqli = new mysqli("example.com", "user", "password", "database");
...
$queryText = "insert into content values (?, ?, ?, ?)";
$query = mysqli->prepare($queryText);
$query->bind_param('dsds',$dbData[0],$dbData[1],$dbData[2],$dbData[3]);
if (!$query->execute()) {
   echo '<br>Execute failed: (' . $query->errno . ') . $query->error;
   echo '<br>dbData[1]: ' .  $dbData[1];
}

该插件适用于大多数$ dbData记录数据,但我在一些记录中出现此错误:

  

执行失败:(1048)列&#39; CText&#39;不能为空   CText:{此处打印的数据在字符串内容中显示为行返回后被截断}

我的问题是绑定是否可能与某些字符有问题,例如换行/回车或其他组合。我没有在代码中设置字符编码,因此默认编码正在使用中。

1 个答案:

答案 0 :(得分:2)

  

绑定是否可能与某些字符有问题,例如换行/回车或其他组合。

没有。绑定没有问题。出现此类错误消息的唯一原因是数据为空时。

这是解决所有类问题的简单清单。

  1. 相信你的眼睛。您不是mysqli准备语句的唯一用户。它们有数百万,而且还没有人遇到过这样的问题。表示如果数据库报告该值不能为null,则值为空。
  2. 无论如何,如果您仍然认为存在错误 - 请创建一个隔离,可重复执行的代码示例。意味着不仅要创建不可操作的草图以向读者展示,而且是一个完整的工作示例,任何人都可以重现。如

    $mysqli = new mysqli("example.com", "user", "password", "database");
    $mysqli->query("CREATE TABLE content ...");
    $queryText = "insert into content values (?, ?, ?, ?)";
    $query = $mysqli->prepare($queryText);
    $dbData[0] = 0;
    $dbData[1] = 'some text that yo think is causing the error';
    $dbData[2] = 0;
    $dbData[3] = 'some another text';
    $query->bind_param('dsds',$dbData[0],$dbData[1],$dbData[2],$dbData[3]);
    if (!$query->execute()) {
       echo '<br>Execute failed: (' . $query->errno . ') . $query->error;
       echo '<br>dbData[1]: ' .  $dbData[1];
    }
    

    没有循环。没有任何未显示的代码 - 但是一个产生指出错误的完整的工作示例。

  3. 使用这样的示例失败后,开始调试代码,找到程序流程或调试方式的逻辑错误。

  4. 你必须意识到这样的问题(&#34;我在明天的天空中有一个PHP的错误&#34;)如果没有可重现的例子,就不能有另一个接收。