08escape.phpt 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. --TEST--
  2. PostgreSQL escape functions
  3. --SKIPIF--
  4. <?php include("skipif.inc"); ?>
  5. --FILE--
  6. <?php
  7. include 'config.inc';
  8. define('FILE_NAME', dirname(__FILE__) . '/php.gif');
  9. // pg_escape_string() test
  10. $before = "ABC\\ABC\'";
  11. $expect = "ABC\\\\ABC\\'";
  12. $expect2 = "ABC\\\\ABC\\\\''"; //the way escape string differs from PostgreSQL 9.0
  13. $after = pg_escape_string($before);
  14. if ($expect === $after || $expect2 === $after) {
  15. echo "pg_escape_string() is Ok\n";
  16. }
  17. else {
  18. echo "pg_escape_string() is NOT Ok\n";
  19. var_dump($before);
  20. var_dump($after);
  21. var_dump($expect);
  22. }
  23. // pg_escape_bytea() test
  24. $before = "ABC\\ABC";
  25. $expect = "ABC\\\\\\\\ABC";
  26. $after = pg_escape_bytea($before);
  27. if ($expect === $after) {
  28. echo "pg_escape_bytea() is Ok\n";
  29. }
  30. else {
  31. echo "pg_escape_byte() is NOT Ok\n";
  32. var_dump($before);
  33. var_dump($after);
  34. var_dump($expect);
  35. }
  36. // Test using database
  37. $data = file_get_contents(FILE_NAME);
  38. $db = pg_connect($conn_str);
  39. // Insert binary to DB
  40. $escaped_data = pg_escape_bytea($data);
  41. pg_query("DELETE FROM ".$table_name." WHERE num = -9999;");
  42. $sql = "INSERT INTO ".$table_name." (num, bin) VALUES (-9999, CAST ('".$escaped_data."' AS BYTEA));";
  43. pg_query($db, $sql);
  44. // Retrieve binary from DB
  45. for ($i = 0; $i < 2; $i++) {
  46. $sql = "SELECT bin::bytea FROM ".$table_name." WHERE num = -9999";
  47. $result = pg_query($db, $sql);
  48. $row = pg_fetch_array($result, 0, PGSQL_ASSOC);
  49. if ($data === pg_unescape_bytea($row['bin'])) {
  50. echo "pg_escape_bytea() actually works with database\n";
  51. break;
  52. }
  53. elseif (!$i) {
  54. // Force bytea escaping and retry
  55. @pg_query($db, "SET bytea_output = 'escape'");
  56. }
  57. else {
  58. $result = pg_query($db, $sql);
  59. echo "pg_escape_bytea() is broken\n";
  60. break;
  61. }
  62. }
  63. // pg_escape_literal/pg_escape_identifier
  64. $before = "ABC\\ABC\'";
  65. $expect = " E'ABC\\\\ABC\\\\'''";
  66. $after = pg_escape_literal($before);
  67. if ($expect === $after) {
  68. echo "pg_escape_literal() is Ok\n";
  69. }
  70. else {
  71. echo "pg_escape_literal() is NOT Ok\n";
  72. var_dump($before);
  73. var_dump($after);
  74. var_dump($expect);
  75. }
  76. $before = "ABC\\ABC\'";
  77. $expect = "\"ABC\ABC\'\"";
  78. $after = pg_escape_identifier($before);
  79. if ($expect === $after) {
  80. echo "pg_escape_identifier() is Ok\n";
  81. }
  82. else {
  83. echo "pg_escape_identifier() is NOT Ok\n";
  84. var_dump($before);
  85. var_dump($after);
  86. var_dump($expect);
  87. }
  88. ?>
  89. --EXPECT--
  90. pg_escape_string() is Ok
  91. pg_escape_bytea() is Ok
  92. pg_escape_bytea() actually works with database
  93. pg_escape_literal() is Ok
  94. pg_escape_identifier() is Ok