使用php或sql转换数字

使用php或sql转换数字,php,sql-server-2008,Php,Sql Server 2008,我在谷歌上花了很多时间,但我不确定我需要用什么样的方式来实现它 我有一个小的网络程序,它可以将数字添加到数据库中,并使用基于选择的查询来清除某些信息,只有当某列中的数字是13位长时,这些查询才会成功,为什么我不知道 因此,我的问题是,使用sql或php使sql中列中的数字自动转换为13的最佳方法是什么?因此,如果我在何处键入1,它将在sql列中以0000000000001而不是1结束 我让php运行的查询非常简单,我不太明白为什么它必须有13个 代码如下 <?php include_onc

我在谷歌上花了很多时间,但我不确定我需要用什么样的方式来实现它

我有一个小的网络程序,它可以将数字添加到数据库中,并使用基于选择的查询来清除某些信息,只有当某列中的数字是13位长时,这些查询才会成功,为什么我不知道

因此,我的问题是,使用sql或php使sql中列中的数字自动转换为13的最佳方法是什么?因此,如果我在何处键入1,它将在sql列中以0000000000001而不是1结束

我让php运行的查询非常简单,我不太明白为什么它必须有13个

代码如下

<?php include_once "ewcfg9.php" ?>
<?php include_once "adodb5/adodb.inc.php" ?>
<?php include_once "phpfn9.php" ?>
<?php include_once "Productsinfo.php" ?>
<?php include_once "userfn9.php" ?>
<?php
$upc= $_GET['upc'];
sleep(2);
header('Location: Productsedit2.php?upc='.$upc.'');
$serverName = "localhost";
$usr="sl";
$pwd="o.o";
$db="SimpleLabel";

$connectionInfo = array("UID" => $usr, "PWD" => $pwd, "Database" => $db);

$conn = sqlsrv_connect($serverName, $connectionInfo);
if ($conn === false)

{

print_r( sqlsrv_errors());

}

$sql="Delete from labelprint where upc=$upc";

$query = sqlsrv_query($conn, $sql) or die(sqlsrv_errors());
$result=sqlsrv_fetch_array($query);
print_r($result); 
sqlsrv_close( $conn);

?>

这是可行的,但仅当upc=13位时有效
那么,有没有人能想到,是否有一种方法可以让sql将所有内容都设置为13位数字,或者让php将字段自动填充为13位数字?

如果
labelprint
字段是一个int(在这种情况下,为什么要将其存储为varchar),则可以如下所示:

$sql="Delete from labelprint where cast(upc as unsigned)=$upc";
但如果你有有趣的数据,这就行不通了。例如
0000000000013
将转换为
13
,但
000000AB00013
将不转换为13

编辑:SQL Server Int可能是4个字节,但这将为您提供-2^31(-2147483648)到2^31-1(2147483647)的范围(这显然不是4个数字)


数据类型的更改也使得上面的答案非常冗余。

因为列是字符串类型,所以必须将其视为字符串类型。(一种选择是使用数字列,然后将其填充到PHPLAND中,或者使用零填充[我认为SQL Server具有零填充]。)

您确实应该使用准备好的语句,但至少需要转义放入SQL中的任何字符串。您可能需要研究SQL注入


无论如何,我会使用sprintf:

$padded = sprintf("%013d", (int) $upc);
那么这个,

$sql="Delete from labelprint where upc=$upc";
将成为

$sql="Delete from labelprint where upc='$padded'";
单引号是必需的,因为它是字符串,而不是数字。sprintf调用中的int cast是安全的,因此可以保证$padded输出可以安全地放入SQL语句中



您还可以使用str_repeat和strlen组合来填充字符串。

如果您在字段中使用字符串而不是int,您可以尝试以下方法:

$upc=str_pad($upc,13,“0”,str_pad_左)

这将使用
0
作为“填充符”填充字符串,使其最多13个字符


更多信息:

数据库中列的类型是什么?此外,您还需要从$_GET转义参数(或者更好地说,使用prepared语句)。类型是varchar(13)也是它的方式,它是否快速运行查询并将变量传递到编辑页面,在编辑页面上可以编辑信息?对不起,我键入了,我将它们存储为nvarchar(13)但我会改成int,然后再试一次this@quatre432varchar或nvarchar,如果你想让它成为
int
,为什么要将它存储在字符串中?以您希望使用的方式存储数据-即使这意味着在将数据插入数据库之前将其更改为正确的数据类型:)好的,我将尝试您的两个建议给我几分钟时间更改代码。如果我将coulmn的设计更改为int,我不能使用超过4的数据类型,列的大小需要允许13,为什么我要使用nvarchar(13)@quatre432将数据类型更改为bigint,你应该会感觉很好。我个人使用PDO进行所有PHP到DB的交互。即使它们完全在我的局域网上,因为我永远不知道什么时候我可能想要将一个工具/脚本推送到公共服务器上,我只想维护一个DAO。corbin在使用您的示例时,查询工作正常,但如果数据库中有一个项目有13位数字,与假设的一样,而另一个不一样,例如1,1不会自动删除,但另一个会删除,但如果13位数字不在其中,则1将使用查询删除非常奇怪Gabe尝试了您的编辑查询现在不再执行任何操作我查看syntac以查看是否遗漏了某些内容还有其他内容,我进入数据库,手动将0添加到1的前面,使其等于总共13个,它仍然无法随查询一起删除,但我用枪扫描的2个项目将非常有用confusing@quatre432如果字段是varchar,则它没有数据是数字的概念。你必须确保它完全匹配。”0001' != '1'表示非整数类型。我可能会考虑将数值数据存储为数字。不过,唯一的问题可能是upc中是否包含非数字字符。感谢您的回复,您的方法会执行类似于crobins的操作,除非upc=1,否则它不会删除它