我正在尝试使用 PHP 保存 MSSQL 数据库。我选择使用 phpMSadmin 来执行此操作。问题是我得到:“无法使用 DB-Library(如 ISQL)或 ODBC 3.7 或更早版本将仅 Unicode 排序规则中的 Unicode 数据或 ntext 数据发送到客户端。” 所以我检查了代码,显然问题出在这里:
$table_query = @mssql_query('SELECT * FROM ' . $table . ';') or die(throwSQLError('unable to retrieve table data'));
整个代码是这样的:
<?php
if(!empty($_POST['skippreview']) && !empty($_POST['doexport']))
$skipheader = true;
include('inc/header.php');
mssql_select_db($_SESSION['database']);
if(!empty($_POST['doexport']))
{
$texttypes = array('binary','char','nchar','varchar','nvarchar');
$masterquery = '';
if(!empty($_POST['dropdb']))
$masterquery .= ('DROP DATABASE ' . $_SESSION['database'] . ';' . "\n");
if(!empty($_POST['createdb']))
$masterquery .= ('CREATE DATABASE ' . $_SESSION['database'] . ';' . "\n");
if(!empty($_POST['useentry']))
$masterquery .= ('USE ' . $_SESSION['database'] . ';' . "\n");
$tablecount = count($_POST['tables']);
for($counter = 0; $counter < $tablecount; $counter++)
{
$table = $_POST['tables'][$counter];
if(!empty($_POST['structure']))
{
$tablequery = ('CREATE TABLE ' . $table);
$columns = array();
$tablesep = explode('.',$table);
if(substr_count($_POST['tables'][$counter],'.') > 0)
{
$colquery = ('sp_columns @table_name = N\'' . $tablesep[1] . '\'');
$colquery .= (', @table_owner = N\'' . $tablesep[0] . '\'');
}
else
$colquery = ('sp_columns @table_name = N\'' . $tablesep[0] . '\'');
$column_query = @mssql_query($colquery) or die(throwSQLError('unable to retrieve column data'));
if(mssql_num_rows($column_query) > 0)
$tablequery .= ' (';
while($row = mssql_fetch_assoc($column_query))
{
// Start Column Conversion
$colspec = ($row['COLUMN_NAME'] . ' ' . strtoupper($row['TYPE_NAME']));
if(in_array($row['TYPE_NAME'],$texttypes))
$colspec .= ('(' . $row['PRECISION'] . ')');
if(!$row['NULLABLE'])
$colspec .= ' NOT NULL';
if($row['COLUMN_DEF'] != '')
$colspec .= (' DEFAULT ' . $row['COLUMN_DEF']);
$tablequery .= (', ' . $colspec);
// End Column Conversion
}
if(mssql_num_rows($column_query) > 0)
$tablequery .= ')';
$tablequery = str_replace('(, ','(',$tablequery);
$masterquery .= ($tablequery . ';' . "\n");
}
if(!empty($_POST['data']))
{
$table_query = @mssql_query('SELECT * FROM ' . $table . ';') or die(throwSQLError('unable to retrieve table data'));
while($row = mssql_fetch_assoc($table_query))
{
if(!isset($schema))
{
$schema = array();
foreach($row AS $key => $value)
$schema[] = $key;
}
$values = array();
foreach($schema AS $col)
if(is_numeric($row[$col]))
$values[] = ('\'' . str_replace('\'','\'\'',$row[$col]) . '\'');
else if(!empty($_POST['base64']))
$values[] = ('\'' . base64_encode(str_replace('\'','\'\'',$row[$col])) . '\'');
else
$values[] = ('\'' . str_replace('\'','\'\'',$row[$col]) . '\'');
$masterquery .= ('INSERT INTO ' . $table . ' (' . implode(',',$schema) . ') VALUES (' . implode(',',$values) . ');' . "\n");
}
}
}
if(!empty($_POST['procedures']))
{
foreach($_POST['procedures'] AS $value)
{
$lines = array();
$doit = false;
$data_query = @mssql_query('sp_helptext \'' . $value . '\'') or die(throwSQLError('unable to retrieve procedure'));
if(!@mssql_num_rows($data_query))
{
$schema_query = @mssql_query('SELECT SPECIFIC_SCHEMA FROM INFORMATION_SCHEMA.ROUTINES WHERE SPECIFIC_NAME = \'' . $value . '\';');
if($schema_query)
{
$schema_array = mssql_fetch_array($schema_query);
$value = ($schema_array['SPECIFIC_SCHEMA'] . '.' . $value);
unset($data_query);
$data_query = @mssql_query('sp_helptext \'' . $value . '\'') or die(throwSQLError('unable to retrieve procedure'));
if(@mssql_num_rows($data_query))
$doit = true;
}
}
else
$doit = true;
if($doit)
{
while($row = mssql_fetch_array($data_query))
$lines[] = $row['Text'];
$masterquery .= (implode('',$lines) . "\n");
}
unset($lines,$doit);
}
}
if(!empty($_POST['views']))
{
foreach($_POST['views'] AS $value)
{
$lines = array();
$doit = false;
$data_query = @mssql_query('sp_helptext \'' . $value . '\'') or die(throwSQLError('unable to retrieve procedure'));
if(!@mssql_num_rows($data_query))
{
$schema_query = @mssql_query('SELECT TABLE_SCHEMA FROM INFORMATION_SCHEMA.VIEWS WHERE TABLE_NAME = \'' . $value . '\';');
if($schema_query)
{
$schema_array = mssql_fetch_array($schema_query);
$value = ($schema_array['TABLE_SCHEMA'] . '.' . $value);
unset($data_query);
$data_query = @mssql_query('sp_helptext \'' . $value . '\'') or die(throwSQLError('unable to retrieve view'));
if(@mssql_num_rows($data_query))
$doit = true;
}
}
else
$doit = true;
if($doit)
{
while($row = mssql_fetch_array($data_query))
$lines[] = $row['Text'];
$masterquery .= (implode('',$lines) . "\n");
}
unset($lines,$doit);
}
}
if(!empty($_POST['functions']))
{
foreach($_POST['functions'] AS $value)
{
$lines = array();
$data_query = @mssql_query('sp_helptext \'' . $value . '\'') or die(throwSQLError('unable to retrieve function'));
if($data_query)
{
while($row = mssql_fetch_array($data_query))
$lines[] = $row['Text'];
$masterquery .= (implode('',$lines) . "\n");
unset($lines);
}
}
}
$masterquery = rtrim($masterquery);
if(empty($_POST['skippreview']))
{
echo '<form name="form1" method="post" action="database_export_download.php">';
echo '<textarea name="data" rows="30" cols="75">';
echo($masterquery);
echo '</textarea>';
echo '<br><br><input type="submit" value="Save to File">';
echo '</form>';
include('inc/footer.php');
}
else
{
header('Content-type: application/x-download');
header('Content-Disposition: attachment; filename="' . $_SESSION['database'] . '.sql"');
header('Content-Length: ' . strlen($masterquery));
echo($masterquery);
exit;
}
}
$tables = array();
$db_query = mssql_query('sp_tables') or die(throwSQLError('unable to retrieve list of tables'));
while($row = mssql_fetch_array($db_query))
{
if($row['TABLE_TYPE'] == 'TABLE' && $row['TABLE_NAME'] != 'dtproperties')
{
if($row['TABLE_OWNER'] != 'dbo')
$tables[] = ($row['TABLE_OWNER'] . '.' . $row['TABLE_NAME']);
else
$tables[] = $row['TABLE_NAME'];
}
}
?>
<script language="javascript">
function doCheck(mode)
{
for(counter = 0; counter < document.form1.tablecount.value; counter++)
document.forms['form1'].elements['tables[]'][counter].checked = mode;
}
function doCheckProcedures(mode)
{
for(counter = 0; counter < document.form1.procedurecount.value; counter++)
document.forms['form1'].elements['procedures[]'][counter].checked = mode;
}
function doCheckViews(mode)
{
for(counter = 0; counter < document.form1.viewcount.value; counter++)
document.forms['form1'].elements['views[]'][counter].checked = mode;
}
function doCheckFunctions(mode)
{
for(counter = 0; counter < document.form1.functioncount.value; counter++)
document.forms['form1'].elements['functions[]'][counter].checked = mode;
}
</script>
<form name="form1" method="post" action="database_export.php">
<input type="hidden" name="doexport" value="yes">
<table width="350" cellpadding="3" cellspacing="3" style="border: 1px solid">
<tr>
<td align="center" colspan="3" style="background: #D0DCE0"><b>Tables</b></td>
</tr>
<tr>
<td style="background: #D0DCE0"> </td>
<td align="center" style="background: #D0DCE0">
<b>Table</b>
</td>
<td align="center" style="background: #D0DCE0">
<b>Records</b>
</td>
</tr>
<?php
$totalrecords = 0;
$toggle = true;
$colors = array('#DDDDDD','#CCCCCC');
if(empty($_POST['tables']))
$_POST['tables'] = array();
foreach($tables AS $row)
{
if($toggle)
$bg = $colors[0];
else
$bg = $colors[1];
$toggle = !$toggle;
if(substr_count($row,'.') > 0)
$record_query = mssql_query('SELECT count(*) AS itemcount FROM ' . $row);
else
$record_query = mssql_query('SELECT count(*) AS itemcount FROM [' . $row . ']');
$record_array = mssql_fetch_array($record_query);
$records = $record_array['itemcount'];
$totalrecords += $records;
echo '<tr>';
if(in_array($row,$_POST['tables']))
echo('<td align="center" style="background: ' . $bg . '"><input type="checkbox" name="tables[]" value="' . $row . '" checked></td>');
else
echo('<td align="center" style="background: ' . $bg . '"><input type="checkbox" name="tables[]" value="' . $row . '"></td>');
echo('<td style="background: ' . $bg . '">' . $row . '</td>');
echo('<td style="background: ' . $bg . '">' . number_format($records) . '</td>');
echo '</tr>';
unset($record_query,$record_array,$records);
}
?>
<tr>
<td align="right" colspan="2" style="background: #EAEAEA">
<b>Total Row Count:</b>
</td>
<td align="right" style="background: #EAEAEA">
<?php echo number_format($totalrecords); ?>
</td>
</tr>
<tr>
<td colspan="3" style="background: #D0DCE0" nowrap>
Select Tables: <a href="javascript:doCheck(true);">All</a> / <a href="javascript:doCheck(false);">None</a>
</td>
</tr>
</table>
<br>
<?php
$procs = array();
$views = array();
$functions = array();
$proc_query = @mssql_query('sp_help') or die(throwSQLError('unable to retrieve list of stored procedures'));
while($row = mssql_fetch_assoc($proc_query))
{
if($row['Object_type'] == 'stored procedure' && ($row['Owner'] == 'dbo' || $_SETTINGS['showsysdata']))
$procs[] = $row['Name'];
else if($row['Object_type'] == 'view' && ($row['Owner'] == 'dbo' || $_SETTINGS['showsysdata']))
$views[] = $row['Name'];
else if(substr_count($row['Object_type'],'function') > 0 && ($row['Owner'] == 'dbo' || $_SETTINGS['showsysdata']))
$functions[] = $row['Name'];
}
?>
<table width="350" cellpadding="3" cellspacing="3" style="border: 1px solid">
<tr>
<td align="center" colspan="2" style="background: #D0DCE0">
<b>Stored Procedures</b>
</td>
</tr>
<tr>
<td style="background: #D0DCE0"> </td>
<td align="center" style="background: #D0DCE0">
<b>Name</b>
</td>
</tr>
<?php
$toggle = true;
$colors = array('#DDDDDD','#CCCCCC');
foreach($procs AS $key => $value)
{
$row['Name'] = $value;
if($toggle)
$bg = $colors[0];
else
$bg = $colors[1];
$toggle = !$toggle;
echo '<tr>';
echo('<td align="center" style="background: ' . $bg . '"><input type="checkbox" name="procedures[]" value="' . $row['Name'] . '"></td>');
echo('<td style="background: ' . $bg . '" nowrap>' . $row['Name'] . '</td>');
echo '</tr>';
unset($row);
}
if(count($procs) == 0)
echo '<tr><td align="center" colspan="3" style="background: #DDDDDD">No Stored Procedures</td></tr>';
?>
<tr>
<td colspan="2" style="background: #D0DCE0">
Select Procedures: <a href="javascript:doCheckProcedures(true);">All</a> / <a href="javascript:doCheckProcedures(false);">None</a>
</td>
</tr>
</table>
<br>
<table width="350" cellpadding="3" cellspacing="3" style="border: 1px solid">
<tr>
<td align="center" colspan="2" style="background: #D0DCE0">
<b>Views</b>
</td>
</tr>
<tr>
<td style="background: #D0DCE0"> </td>
<td align="center" style="background: #D0DCE0">
<b>Name</b>
</td>
</tr>
<?php
$toggle = true;
$colors = array('#DDDDDD','#CCCCCC');
foreach($views AS $key => $value)
{
$row['Name'] = $value;
if($toggle)
$bg = $colors[0];
else
$bg = $colors[1];
$toggle = !$toggle;
echo '<tr>';
echo('<td align="center" style="background: ' . $bg . '"><input type="checkbox" name="views[]" value="' . $row['Name'] . '"></td>');
echo('<td style="background: ' . $bg . '" nowrap>' . $row['Name'] . '</td>');
echo '</tr>';
unset($row);
}
if(count($procs) == 0)
echo '<tr><td align="center" colspan="3" style="background: #DDDDDD">No Views</td></tr>';
?>
<tr>
<td colspan="2" style="background: #D0DCE0">
Select Views: <a href="javascript:doCheckViews(true);">All</a> / <a href="javascript:doCheckViews(false);">None</a>
</td>
</tr>
</table>
<br>
<table width="350" cellpadding="3" cellspacing="3" style="border: 1px solid">
<tr>
<td align="center" colspan="2" style="background: #D0DCE0">
<b>Functions</b>
</td>
</tr>
<tr>
<td style="background: #D0DCE0"> </td>
<td align="center" style="background: #D0DCE0">
<b>Name</b>
</td>
</tr>
<?php
$toggle = true;
$colors = array('#DDDDDD','#CCCCCC');
foreach($functions AS $key => $value)
{
$row['Name'] = $value;
if($toggle)
$bg = $colors[0];
else
$bg = $colors[1];
$toggle = !$toggle;
echo '<tr>';
echo('<td align="center" style="background: ' . $bg . '"><input type="checkbox" name="functions[]" value="' . $row['Name'] . '"></td>');
echo('<td style="background: ' . $bg . '" nowrap>' . $row['Name'] . '</td>');
echo '</tr>';
unset($row);
}
if(count($functions) == 0)
echo '<tr><td align="center" colspan="2" style="background: #DDDDDD">No Functions</td></tr>';
?>
<tr>
<td align="center" colspan="2" style="background: #D0DCE0">
Select Functions: <a href="javascript:doCheckFunctions(true);">All</a> / <a href="javascript:doCheckFunctions(false);">None</a>
</td>
</tr>
</table>
<br>
<input type="hidden" name="tablecount" value="<?php echo(count($tables)); ?>">
<input type="hidden" name="procedurecount" value="<?php echo(count($procs)); ?>">
<input type="hidden" name="viewcount" value="<?php echo(count($views)); ?>">
<input type="hidden" name="functioncount" value="<?php echo(count($functions)); ?>">
<table width="350" cellpadding="3" cellspacing="3" style="border: 1px solid">
<tr>
<td align="center" colspan="2" style="background: #D0DCE0">
<b>Export Options</b>
</td>
</tr>
<tr>
<td align="right" style="background: #CCCCCC" valign="top" nowrap>
Selection:
</td>
<td style="background: #CCCCCC" nowrap>
<input type="checkbox" name="structure" value="yes"> Structure<br>
<input type="checkbox" name="data" value="yes"> Data
</td>
</tr>
<tr>
<td align="right" style="background: #CCCCCC" valign="top" nowrap>
Preparation:
</td>
<td style="background: #CCCCCC" nowrap>
<input type="checkbox" name="dropdb" value="yes"> Drop Database First<br>
<input type="checkbox" name="createdb" value="yes"> Use Create Database<br>
<input type="checkbox" name="useentry" value="yes"> Add "USE" Database Switch
</td>
</tr>
<tr>
<td align="right" style="background: #CCCCCC" valign="top" nowrap>
Method:
</td>
<td style="background: #CCCCCC" nowrap>
<input type="checkbox" name="base64" value="yes"> Base-64 Encode Strings<br>
<input type="checkbox" name="skippreview" value="yes"> Skip Export Preview
</td>
</tr>
<tr>
<td align="right" colspan="2" style="background: #D0DCE0">
<input type="submit" value="Export">
</td>
</tr>
</table>
</form>
<?php include('inc/footer.php'); ?>
有没有办法解决这个问题?非常感谢。