2015-09-07 79 views
0

第一次发布到StackOverflow,但我一直是这里评论的很长一段时间的读者。PHP MySQLi准备语句绑定某些字符的错误?

我遇到了一个编程错误,几个小时后我找不出来,也没有找到任何似乎适用的问题和答案,所以这里是我的第一篇文章!

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

$ dbData数组与表中插入的列相关。 该表被称为“内容”,它对第二列有一个约束,它不能为空。它被命名为'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)列“CTEXT”不能为空 CTEXT:{数据在这里打印的是这似乎是在字符串内容一行返回后截断}

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

+0

你可以使用'var_dump($ dbData [1])'在你看到错误信息的地方,当你看到它时,你也会看到那个值是什么造成了这个问题 –

+0

var_dump显示一个字符串(51)“{内容}“。 –

+0

内容实际上是约600个字符,存储在绑定使用的数组中。 –

回答

2

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

没有。绑定没有问题。这种错误消息的唯一原因是数据为空时。

这里是简单的清单,以解决所有类型的问题。

  1. 相信你的眼睛。你不是mysqli准备好的语句的唯一用户。有数百万人,还没有人遇到过这样的问题。意思是如果数据库报告该值不能为空,则值为空。
  2. 无论如何,如果你仍然认为有一个bug - 创建一个孤立,可重新编程的代码示例。意味着不仅仅是为了向读者展示不可行的草图,而是一个任何人都可以复制的完整工作示例。如

    $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. 在这样一个例子失败后,开始调试你的代码,找到一个逻辑错误,无论是程序流还是调试方式。

你必须认识到,这样的问题(“我在PHP出晴空的一个bug”)不能有另一个接收没有reproduceable例子。

+0

感谢您的建议,将采取这种方法在后续的错误问题。 –